2017-10-09 1 views
2

J'ai un programme Windows C# (.net 3.5) qui s'exécute en arrière-plan sur un contrôleur en temps réel (Windows 7 Embedded).C# comment ouvrir une session de programme inattendue

Après quelques jours, le processus se termine apparemment. Maintenant, je suis en train de consigner complètement les actions et les exceptions de mon programme. Tout ce qui peut déclencher une exception est entouré par try/catch et est en cours d'écriture dans un fichier journal, et si le logger a une exception écrite dans le journal des événements Windows. Mais il n'y a rien dans les journaux qui laisse entendre une exception qui pourrait provoquer une interruption du programme. Y at-il d'autres techniques pour attraper et consigner la terminaison du programme?

Jusqu'à présent, je ne pouvais pas reproduire le bogue dans une session de débogage en ligne.

Le programme lui-même est très simple. Il utilise deux chronomètres et génère un thread pour communiquer avec un programme en temps réel. Il écrit un booléen 'vivant', un entier 'erreur' et lit un autre entier. La taille du fichier journal est limitée à 10 Mooctets. Si la taille est atteinte, le fichier est renommé avec une date et un nouveau fichier est ouvert. Les fichiers de plus de 30 jours seront supprimés.

J'ai vérifié les journaux d'événements de Windows et n'ai rien trouvé qui se rapporte directement au programme.

Que feriez-vous?

+2

Regardez gestionnaire global d'exception, mayby ​​il peut attraper quelque chose. – BWA

+0

@BWA D'accord, ce serait ma suggestion aussi. – rmjoia

+0

double possible de [ Comment attraper toutes les exceptions/accidents dans une application .NET] (https://stackoverflow.com/questions/82483/how-to-catch-all-exceptions-crashes-in-a-net-app) – Sinatr

Répondre

0

La meilleure approche pour vous serait de considérer les exceptions globales. Vous pouvez attraper les exceptions de la première chance qui attireront toute exception qui se produit dans votre application qui peut être fait aussi simplement que l'ajout du morceau de code suivant:

AppDomain.CurrentDomain.FirstChanceException += (sender, eventArgs) => 
{ 
    Debug.WriteLine(eventArgs.Exception.ToString()); 
}; 

également pour plus de détails sur la manipulation à l'exception globale que vous pouvez consulter à this article vraiment utile.

+0

C'est un bon indice. . – Simorgh

0

Je pourrais répondre à ma propre question.

Malheureusement, j'ai omis un détail dans ma question que j'ai jugé non pertinent. L'application est démarrée par le planificateur de tâches Windows au démarrage du système avant qu'un utilisateur se connecte. Une case à cocher dans les propriétés de la tâche met fin à la tâche si elle prend plus de 3 jours. J'ai oublié de décocher :(.

Merci pour vos contributions.