Come rilevare un'app non gestita è stata interrotta
-
20-08-2019 - |
Domanda
Ho un'app C # che richiama un'applicazione C ++ non gestita tramite Process.Start ()
Su alcune macchine, se questa app C ++ si interrompe, mi rimane la finestra di dialogo di errore Just-In-Time che mostra
Esiste un modo da C # per rilevare che l'app C ++ ha errato e riavviarla
(Non ho la fonte per e quindi non posso modificare l'app C ++)
Soluzione
Viene visualizzata la finestra di dialogo del debugger JIT perché l'app C ++ si è bloccata in qualche modo. Mentre la finestra di dialogo è aperta, il processo è ancora presente (ma sospeso), il che significa che la classe Process non lo considererà avere & Quot; uscito & Quot; fino a quando il dialogo JIT non viene chiuso o un debugger allegato termina il processo.
È possibile disabilitare il debug JIT sui computer che presentano il problema ( penso che la disabilitazione del servizio Machine Debug Manager potrebbe disabilitare il debug JIT), consentendo all'applicazione di arrestarsi in modo anomalo e morire (e, quindi, segnala come " uscito ") oppure (e non ho idea di come faresti per farlo) vedi se riesci a fare in modo che l'app C # host si colleghi come debugger per l'app C ++ e ricevere la notifica del crash dall'app C ++, terminarlo e quindi agire sulle informazioni che sono terminate.
Altri suggerimenti
Se il C ++ è basato su console puoi controllare due cose,
-
Il codice di uscita, generalmente 0 significa che normalmente è chiuso altrimenti è un problema (ma penso che questo dipenda dalla convenzione utilizzata per sviluppare queste applicazioni)
-
Controlla l'errore standard se è vuoto, quindi tutto è ok
utilizzando (Processo p = nuovo Processo ()) {
p.StartInfo.UseShellExecute = false; p.StartInfo.RedirectStandardError = true; p.StartInfo.FileName = "any.exe"; p.Start(); string error = p.StandardError.ReadToEnd(); p.WaitForExit() if(error.Length == 0 && p.ExitCode == 0) { } }