2009-07-15 7 views
9

Ho un'applicazione che ospita un codice di terze parti instabile che non posso controllare in un processo esterno per proteggere la mia applicazione principale da errori brutti che mostra. Il mio processo genitore sta monitorando l'altro processo e facendo "la cosa giusta (tm)" quando fallisce.Disattivazione della segnalazione degli errori di Windows (Dr. Watson) per il mio processo

Il problema che ho è che il Dr. Watson sta ancora rilevando arresti anomali nel processo isolato e si collega ai processi durante il down down per fare un crash dump. Questo ha i due problemi di: 1. Drammaticamente rallentando il tempo necessario a me per rilevare un errore perché il processo rimane attivo mentre viene eseguito il crash dump. 2. Mostrando popup fastidiosi all'utente chiedendo se vogliono inviare i report degli errori a Microsoft.

Chiaramente preferirei correggere gli errori nel processo figlio, ma dato che non è un'opzione, mi piacerebbe poter disabilitare in modo selettivo Dr. Watson (e Segnalazione errori di Windows in Vista +) per quel processo .

Sto eseguendo parte del mio codice nel processo prima di passare al bit non attendibile, quindi se c'è un'API che posso chiamare che influisce sul processo corrente andrebbe bene.

Sono a conoscenza di: http://support.microsoft.com/default.aspx/kb/188296 che disabiliterà Dr. Watson per l'intera macchina. Non voglio farlo perché mi farebbe diventare un cattivo cittadino nel cestino di un ambiente a livello di macchina.

Sono anche a conoscenza dell'opzione WerSetFlags in Vista + che sembra disabilitare la segnalazione degli errori di Windows per il processo corrente, ma ho bisogno di qualcosa che disabiliterà Dr.Watson nelle precedenti versioni del sistema operativo.

risposta

2

Il buon dottore viene richiamato quando un processo non gestisce un certo eccezione. Pertanto, la via comune da seguire sarebbe gestire tutte le eccezioni da soli. Nel tuo caso, è molto più difficile dal momento che non possiedi il codice del processo in crash. Quindi, è possibile iniettare il codice nell'altro processo in fase di esecuzione e installare un gestore di eccezioni che ingerisce l'eccezione che causa l'arresto anomalo. Una volta catturato, chiudere con grazia il processo.

Qui ci sono alcune domande che parlano dell'iniezione di codice in un altro processo. Per quanto riguarda il gestore degli arresti anomali, è possibile utilizzare set an unhandled exception filter o add a vectored exception handler. Nota che per quest'ultimo, dovrai stare attento a non ingoiare le eccezioni legittime che sono effettivamente gestite all'interno dell'altro processo, ovvero trovare un modo per riconoscere l'eccezione di arresto anomalo e accertarti che sia l'unica gestita.