Détection d’un crash de processus dans .NET

Existe-t-il un moyen de déterminer qu’un processus démarré par mon programme est tombé en panne? Actuellement, la solution que j’ai trouvée consiste à examiner Process.ExitCode et à examiner la valeur:

  this.STProcess = Process.Start(this.CreateProcessStartInfo()); this.STProcess.WaitForExit(); if (STProcess.ExitCode != 0) { //raise error event... } 

Je voulais savoir s’il y avait une façon plus élégante (et précise) de le faire?

Je préférerais des réponses en C # et utiliser P / Invoke est bien aussi.

PS – Je dois travailler sur Windows XP / Vista / 7

Non.

À moins que vous ne puissiez influencer le processus d’une manière quelconque (écriture d’erreurs dans le fichier Eventlog? Un fichier), vous n’avez aucun moyen externe de savoir qu’un processus est tombé en panne, pour autant que je sache. Pour vous, c’est juste un processus qui a disparu. Même Windows ne gardera pas ces informations où que je sache. Il n’existe plus et à moins que le processus en quelque sorte gardé les détails, ils sont partis.

Pour Windows 7, il existe une API de redémarrage et de récupération des applications . Pour .NET, vous pouvez utiliser Windows API Code Pack .

Généralement, vous pouvez rechercher périodiquement l’existence d’un processus (application de surveillance).

Lorsqu’un processus se bloque, Windows vérifie d’abord si un débogueur Just-In-Time est configuré sur votre système. Si tel est le cas, vous pouvez demander à ce débogueur de s’attacher au processus juste avant qu’il ne plante. En règle générale, vous utiliserez cette fonctionnalité pour générer un vidage de la mémoire à mesure que le processus se bloque. Quel que soit le débogueur auquel vous vous connectez, vous connaissez le PID et le nom du processus en panne. Vous pouvez soit utiliser les fonctionnalités des outils de débogage existants, tels que ADPlus, soit écrire votre propre programme et indiquer à Windows qu’il s’agit de votre débogueur Just-In-Time et qu’il doit être exécuté lorsqu’un processus se bloque. Je pense que vous pouvez configurer un débogueur JIT spécifiquement pour tout nom de processus.

Voir http://msdn.microsoft.com/en-us/library/5hs4b7a6(v=VS.80).aspx

Je pense que si vous définissez l’entrée de Registre HKLM \ Software \ Microsoft \ Windows NT \ Version actuelle \ AeDebug \ Debugger sur “DirectoryOfYourProgram \ YourProgram.exe” -p% ld où YourProgram.exe attend un PID transmis avec le – Indicateur p, votre programme sera appelé et transmettra le bon PID en cas de panne d’un processus.