Отключение отчетов об ошибках Windows (Dr. Watson) для моего процесса - PullRequest
10 голосов
/ 16 июля 2009

У меня есть приложение, в котором размещен нестабильный сторонний код, который я не могу контролировать во внешнем процессе, чтобы защитить мое основное приложение от неприятных ошибок, которые оно демонстрирует. Мой родительский процесс контролирует другой процесс и делает "правильные вещи (tm)", когда он терпит неудачу.

Проблема, с которой я столкнулся, заключается в том, что доктор Ватсон все еще обнаруживает сбои в изолированном процессе и подключается к процессам на пути вниз, чтобы получить аварийный дамп. Это имеет две проблемы: 1. Значительно замедляет время, необходимое для обнаружения сбоя, потому что процесс остается активным, пока выполняется аварийный дамп. 2. Отображение назойливых всплывающих окон пользователю, спрашивающему, хотят ли они отправить отчеты об ошибках в Microsoft.

Я бы предпочел исправить ошибки в дочернем процессе, но, учитывая, что это не вариант, я хотел бы иметь возможность выборочно отключать Dr. Watson (и Windows Error Reporting в Vista +) для этого процесса.

Я выполняю часть своего собственного кода в процессе перед передачей ненадежному биту, поэтому, если есть API, который я могу вызвать, который влияет на текущий процесс, что будет хорошо.

Мне известно: http://support.microsoft.com/default.aspx/kb/188296, который отключил бы доктора Ватсона для всей машины. Я не хочу этого делать, потому что это сделало бы меня плохим гражданином, чтобы испортить настройки всей машины.

Мне также известна опция WerSetFlags в Vista +, которая может отключить отчеты об ошибках Windows для текущего процесса, но мне нужно что-то, что отключит Dr.Watson в более ранних версиях ОС.

Ответы [ 2 ]

3 голосов
/ 16 июля 2009

Хороший доктор вызывается, когда процесс не обрабатывает определенное исключение. Следовательно, обычным способом было бы обрабатывать все исключения самостоятельно. В вашем случае это намного сложнее, так как вы не владеете кодом процесса сбоя. Затем вы можете вставить свой код в другой процесс во время выполнения и установить обработчик исключений, который проглотит исключение, вызывающее сбой. Когда поймано, изящно остановите процесс.

Здесь довольно много вопросов, говорящих о внедрении кода в другой процесс. Что касается обработчика сбоя, вы можете либо установить необработанный фильтр исключений , либо добавить векторный обработчик исключений . Обратите внимание, что для последнего вам нужно быть осторожным, чтобы не проглотить допустимые исключения, которые фактически обрабатываются внутри другого процесса, а именно найти способ распознать аварийное исключение и убедиться, что оно обрабатывается единственно.

2 голосов
/ 16 июля 2009

Вы хотите отключить всплывающее окно GPF: http://blogs.msdn.com/oldnewthing/archive/2004/07/27/198410.aspx

...