2016-12-01 3 views
-1

Mon code:crash d'exécutable lancé par C# Process.Start()

ProcessInfo processInfo = ... 
Process proc = Process.Start(processInfo); 
proc.WaitForExit(); 
if (proc.ExitCode != 0) 
{ 
    // ... 
} 

Mon problème est que le processus (un exécutable C++) se bloque parfois en raison des exceptions non gérées, dans des circonstances inconnues.

Je peux dire que l'exécutable a planté, car lors d'un crash, il renvoie un code de sortie négatif (ou non nul d'ailleurs). Cependant, je ne peux pas créer un vidage de processus pour enquêter.

Si j'avais au moins le message "Programme arrêté de fonctionner" de Windows, j'ai pu créer le vidage manuellement.

Bien sûr, je peux utiliser un logiciel comme Debug Diag pour surveiller les exécutables et faire un vidage sur incident, mais je préfère avoir une solution interne plus générique.

Répondre

0

Je pense que c'est vraiment à l'exécutable appelé d'émettre l'erreur. Que ce soit la sortie vers la fenêtre ou la mise d'une entrée dans l'observateur d'événements, etc. dépend de l'application en question. Vous devriez être capable de lire les messages de sortie.

0

Avez-vous essayé de capturer la sortie stdErr en plus de stdOut?

Par exemple:

Process installProcess = new Process 
{ 
    StartInfo = 
    { 
     FileName = exeName, 
     Arguments = args, 
     CreateNoWindow = true, 
     UseShellExecute = false, 
     WindowStyle = ProcessWindowStyle.Hidden, 
     RedirectStandardOutput = true, 
     RedirectStandardError = true 
    } 
}; 

installProcess.Start(); 

string processStandardOutput = installProcess.StandardOutput.ReadToEnd(); 
string processStandardError = installProcess.StandardError.ReadToEnd(); 

// Check both strings for !IsNullOrEmpty and log something of interest 

installProcess.WaitForExit(); 
ExitCode = installProcess.ExitCode; 

// If ExitCode < 0, log the StandardError output...