Сводка ответов jdehaan и Eric Brown, а также этот вопрос (см. Также этот вопрос ):
NB Эти решения могут влиять и на другие сообщения об ошибках, например, на ошибку загрузки DLL или открытия файла.
Вариант 1: глобальное отключение
Работает глобально на всемучетная запись пользователя или машина, которая может быть как преимуществом, так и недостатком.
Установите [HKLM|HKCU]\Software\Microsoft\Windows\Windows Error Reporting\DontShowUI
в 1. Дополнительная информация: Настройки WER .
Опция2: Отключить для приложения
Требуется модификация программы сбоя, описанная в документации как лучшая практика, не подходящая для библиотечной функции.
Вызов SetErrorMode :SetErrorMode(SetErrorMode(0) | SEM_NOGPFAULTERRORBOX);
(или с SEM_FAILCRITICALERRORS
).Дополнительная информация: Отключение диалогового окна сбоя программы (объясняется странное расположение вызовов).
Опция 2a: отключить для функции :
Требуетсямодификация программы сбоя, требуется Windows 7/2008 R2 (только для настольных приложений) или выше, описанная в документации как предпочтительная для SetErrorMode
, подходящая для поточно-ориентированной библиотечной функции.
Вызов и сброс SetThreadErrorMode :
DWORD OldThreadErrorMode = 0;
SetThreadErrorMode(SEM_FAILCRITICALERRORS,& OldThreadErrorMode);
…
SetThreadErrorMode (z_OldThreadErrorMode, NULL);
Дополнительная информация: мало доступно?
Опция 3: указать обработчик
Требуется модификация программы сбоя.
Используйте SetUnhandledExceptionFilter
, чтобы установить собственный структурированный обработчик исключений, который просто завершается, возможно, с отчетами и, возможно, попыткой очистки.
Вариант 4: Поймать как исключение
Требуется модификация программы сбоя.Только для приложений .NET.
Оберните весь код в глобальный блок try / catch.Укажите HandleProcessCorruptedStateExceptionsAttribute
и, возможно, также SecurityCriticalAttribute
в методе, перехватывающем исключения.Дополнительная информация: Обработка исключений из-за поврежденного состояния
Примечание : это может не отловить сбои, вызванные Managed Debugging Assistants ;в этом случае их также необходимо отключить в приложении.
Вариант 5: остановить процесс создания отчетов
Работает глобально для всей учетной записи пользователя, но только дляконтролируемая продолжительность.
Завершать процесс создания отчетов об ошибках Windows при каждом его отображении:
var werKiller = new Thread(() =>
{
while (true)
{
foreach (var proc in Process.GetProcessesByName("WerFault"))
proc.Kill();
Thread.Sleep(3000);
}
});
werKiller.IsBackground = true;
werKiller.Start();
Это все еще не полностью пуленепробиваемое решение, поскольку консольное приложение может аварийно завершить работу с помощью другого сообщения об ошибкепо-видимому, отображается внутренней функцией NtRaiseHardError
:
![alt text](https://i.stack.imgur.com/fBsTI.png)