2009-07-15 13 views
9

Mam aplikację, która obsługuje pewien niestabilny kod strony trzeciej, którego nie mogę kontrolować w zewnętrznym procesie, aby chronić moją główną aplikację przed nieprzyjemnymi błędami, które ona ujawnia. Mój proces macierzysty monitoruje drugi proces i robi "właściwą rzecz (tm)", gdy zawiedzie.Wyłączanie zgłaszania błędów systemu Windows (Dr Watson) dla mojego procesu

Problem, który mam, polega na tym, że doktor Watson wciąż wykrywa awarie w odizolowanym procesie i przywiązuje się do procesów po drodze, aby wykonać awaryjny zrzut. Ma to dwa następujące problemy: 1. Dramatyczne spowolnienie czasu potrzebnego mi do wykrycia awarii, ponieważ proces pozostaje żywy podczas wykonywania zrzutu awaryjnego. 2. Wyświetlanie irytujących wyskakujących okienek do użytkownika z pytaniem, czy chce przesłać raporty o błędach do firmy Microsoft.

Oczywiście wolałbym naprawić błędy w procesie potomnym, ale biorąc pod uwagę, że nie jest to opcja, chciałbym być w stanie selektywnie wyłączyć Dr. Watson (i Windows Error Reporting w Vista +) dla tego procesu .

Używam trochę mojego własnego kodu w procesie przed przekazaniem do niezaufanego bitu, więc jeśli istnieje interfejs API, który mogę wywołać, wpływa na bieżący proces, który byłby w porządku.

Jestem świadomy: http://support.microsoft.com/default.aspx/kb/188296, który wyłączałby Dr. Watsona dla całej maszyny. Nie chcę tego robić, ponieważ spowodowałoby to, że jestem złym obywatelem, który zniszczyłby maszynową scenerię.

Jestem również świadomy opcji WerSetFlags w Vista +, która wydaje się wyłączać zgłaszanie błędów systemu Windows dla bieżącego procesu, ale potrzebuję czegoś, co wyłączy Dr.Watson w starszych wersjach systemu operacyjnego.

Odpowiedz

2

Dobry lekarz jest wywoływana gdy proces nie obsługuje pewien wyjątek. Dlatego powszechnym sposobem postępowania byłoby samodzielne radzenie sobie z wszystkimi wyjątkami. W twoim przypadku jest to o wiele trudniejsze, ponieważ nie jesteś właścicielem awaryjnego kodu procesu. Możesz wtedy wprowadzić kod do innego procesu w środowisku wykonawczym i zainstalować procedurę obsługi wyjątków, która połknie wyjątek powodujący awarię. Po złapaniu, z wdziękiem zamknij proces.

Jest tu sporo pytań dotyczących wstrzykiwania kodu do innego procesu. Jeśli chodzi o program obsługi wypadków, możesz albo set an unhandled exception filter, albo add a vectored exception handler. Zauważ, że w tym drugim przypadku musisz uważać, aby nie połknąć wyjątków, które są obsługiwane w ramach innego procesu, a mianowicie znaleźć sposób na rozpoznanie wyjątku powodującego awarię i upewnić się, że jest to jedyny, z którym sobie poradzisz.

Powiązane problemy