2009-07-15 9 views
9

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

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

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

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

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

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

ответ

2

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

Здесь довольно много вопросов, связанных с введением кода в другой процесс. Что касается обработчика сбоя, вы можете либо set an unhandled exception filter, либо add a vectored exception handler. Обратите внимание, что для последнего вам нужно быть осторожным, чтобы не проглотить законные исключения, которые фактически обрабатываются внутри другого процесса, а именно найти способ распознать исключение сбоя и убедиться, что он является единственным, с которым вы работаете.