2010-02-03 5 views
5

Il mio processo a volte genera eccezioni come dllnotfound dopo l'avvio. Ho un servizio di monitoraggio responsabile per il mantenimento dello stato coerente del processo.come monitorare se un determinato processo genera un'eccezione, utilizzando il servizio Windows in C#

Come posso tenere traccia dello stato del mio processo utilizzando il servizio di Windows.

Esiste un'implementazione open source del servizio Windows che mantiene/traccia lo stato del processo in Windows.

risposta

2

Modifica: Quindi il problema reale non era che il processo stava morendo, ma che il processo era bloccato in una finestra di dialogo di gestione delle eccezioni in attesa che l'utente colpisse il debug o l'annullamento. La soluzione al problema è stato quello di disabilitare la finestra di debug JIT .net, istruzioni qui http://weblogs.asp.net/fmarguerie/archive/2004/08/27/how-to-turn-off-disable-the-net-jit-debugging-dialog.aspx

La mia soluzione originale proposta è al di sotto


Non un servizio finestra, ma questo è un programma abbastanza facile .NET scrivere.

utilizzare System.Diagnostics.Process per ottenere un oggetto Processo per il processo che si desidera controllare. È possibile utilizzare GetProcessByName se si desidera aprire un processo esistente. Se si crea il processo da C#, allora si avrà già l'oggetto del processo.

Quindi è possibile solo WaitForExit con o senza un timeout sull'oggetto Process. o testare la proprietà o registrare una richiamata Exited. Una volta che il processo è terminato, è possibile verificare la proprietà ExitCode per scoprire se il processo ha restituito un valore di errore.

+0

sì ho iniziato il processo da C#. quando il processo genera un'eccezione, il suo stato è in esecuzione, controllo la proprietà hasexited() ogni 10 secondi ma lo stato non viene chiuso. il processo genera un'eccezione dllnotfound e mi chiede meteo voglio avviare un debugger. – Kazoom

+0

Hai il codice per il processo di destinazione? Dovrai eseguire codice _nel processo di destinazione_ se vuoi fare qualcosa con l'eccezione _prima_ causa l'uscita del processo. –

+0

cambiare il codice del processo di destinazione sarebbe la mia ultima risorsa, c'è qualche impostazione che impedirebbe a Windows di dare una finestra di messaggio pop-up quando un processo genera un'eccezione come dllnotfound. se riesco a capire in qualche modo di chiudere automaticamente la finestra popup una volta che arriva un errore il processo muore, altrimenti continua a funzionare – Kazoom

2

Questo non è possibile, le eccezioni sono locali a un thread prima, locale a un processo secondario se non gestito. Un'eccezione non gestita interromperà il processo. L'unico shrapnel che potresti raccogliere da un processo così morto è il codice di uscita del processo. Quale dovrebbe essere impostato su 0xe0434f4e, il codice di eccezione per un'eccezione non gestita. Non sono disponibili altre informazioni pertinenti, a meno che non vi sia un gestore di eccezioni non gestito nel processo che registra lo stato. Questo stato è molto inaffidabile, il processo ha subito un grave attacco di cuore.

Mantenere più processi in sincronia e funzionare correttamente quando possono morire dalle eccezioni è straordinariamente difficile. Solo la morte può essere rilevata in modo affidabile, evitare di fare di più.

+0

sì, ma se dll non viene trovato il processo si apre una finestra di messaggio e attende che l'utente lo respinga. nel frattempo lo stato del processo è in esecuzione, è possibile rendere il processo non popup della finestra di messaggio come fa e muore. – Kazoom

+0

Ha davvero importanza? Non funzionerà mai correttamente a meno che qualcuno non inserisca la DLL nel posto giusto. Qualcuno lo farà dopo aver cliccato ok 10 volte o giù di lì. Anyhoo, forse SetErrorMode() per sopprimere la finestra del messaggio. –

+0

dllnotfoundexception è solo un esempio, non voglio che il processo si blocchi e il monitor che pensa che sia ancora in esecuzione, se il processo rileva un'eccezione dovrebbe morire, quindi il monitor può riavviare una nuova istanza di quel processo. l'intero processo/monitor funziona senza l'intervento dell'utente. non ci sarebbe nessuno da cliccare ok :( – Kazoom

-1

Una cosa che si potrebbe fare è monitorare l'utilizzo della CPU del processo. Suppongo che il tuo processo vada via quando viene lanciata l'eccezione. Pertanto, l'utilizzo della CPU del processo dovrebbe essere 0 poiché non è più disponibile. Pertanto, se l'utilizzo della CPU rimane a zero per un certo periodo di tempo, è possibile presumere che il processo abbia generato un'eccezione. Questo metodo non è infallibile poiché stai basando la tua decisione sull'utilizzo della CPU e un processo legittimo può avere un utilizzo della CPU pari a zero per un determinato periodo di tempo. È possibile incorporare questo controllo all'interno del proprio servizio di monitoraggio o scrivere un semplice script VB per verificare l'utilizzo della CPU del processo esternamente.

+0

Ti piacerebbe spiegare il motivo del voto negativo? – naivnomore

0

Nel caso di DllNotFoundException e altre cose che accadono in fase di avvio, si può avere l'applicazione indica quando è finito l'avvio. È necessario scrivere un timestamp su un file, ad esempio. Il tuo monitor può confrontare il tempo di avvio dell'applicazione con il tempo nel file.

1

Fate in modo che il vostro processo scriva eventi ed eccezioni al registro dell'applicazione del sistema e controlli periodicamente il controllo degli ingressi per trovare gli eventi relativi al vostro processo e potete controllare gli eventi di sistema per gli eventi di avvio e arresto del servizio.

Se il processo stesso è un servizio di Windows, è possibile controllarne lo stato utilizzando "System.ServiceProcess.ServiceController".