Как отключить диалоговое окно «Отладка / закрыть приложение» в Windows Vista?

Когда происходит сбой приложения в Windows и установлен отладчик, например Visual Studio, появляется следующий модальный диалог:

[Название: Microsoft Windows]

X перестал работать

Проблема привела к тому, что программа перестала правильно работать. Windows закроет программу и сообщит вам, если решение доступно.

[Отладка] [Закрыть приложение]

Есть ли способ отключить этот диалог? То есть программа просто вылетает и тихо горит?

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

Обыскивая вокруг, я думаю, что нашел решение для отключения этого в Windows XP, которое выдает этот ключ reg:

HKLM \ Программное обеспечение \ Microsoft \ Windows NT \ CurrentVersion \ AeDebug \ Debugger

Однако в Windows Vista это не сработало.


person Chris Smith    schedule 28.12.2008    source источник
comment
Использование ключа AeDebug \ Debugger не повлияло на меня под Windows XP ни на консольные приложения, скомпилированные с отладочными, ни на неотладочные библиотеки.   -  person rptb1    schedule 15.07.2013


Ответы (11)


Чтобы система отчетов об ошибках Windows (WER) создавала аварийный дамп и закрывала приложение, вместо того, чтобы предлагать вам отладить программу, вы можете установить следующие записи реестра:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting]
"ForceQueue"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\Consent]
"DefaultConsent"=dword:00000001

После установки этого параметра, когда ваши приложения вылетают, вы должны увидеть файлы * .hdmp и * .mdmp в:

%ALLUSERSPROFILE%\Microsoft\Windows\WER\
person NicJ    schedule 28.12.2008
comment
DefaultConsent = 1 кажется значением по умолчанию. А как насчет DontShowUI? - person Zitrax; 14.03.2011
comment
Документация ForceQueue расплывчата, я не совсем понимаю, что она означает. - person Zitrax; 14.03.2011
comment
У меня сработало три значения: ForceQueue, DefaultConsent и DontShowUI. Последний был нужен. Но я не вижу ни одного из упомянутых вами файлов * .hdmp или * .mdmp. Но в журнале событий, как и всегда, есть ошибки. Но по крайней мере сейчас мой сервис не виснет. - person Daniel Williams; 13.07.2011
comment
На Windows XP ничего из этого не подействовало. - person rptb1; 15.07.2013
comment
@NicJ, пожалуйста, добавьте к своему ответу DontShowUI = 1, это важный - person Youda008; 22.12.2014
comment
Или из командной строки: reg add HKLM \ SOFTWARE \ Microsoft \ Windows \ Windows Error Reporting \ Consent / v DefaultConsent / t REG_DWORD / d 1 / f reg add HKLM \ SOFTWARE \ Microsoft \ Windows \ Windows Error Reporting / v ForceQueue / t REG_DWORD / d 1 / f - person jhclark; 07.01.2016
comment
Я считаю, что также можно установить под HKEY_CURRENT_USER - person PJTraill; 11.01.2016
comment
Редактирование реестра Windows - это путь в ИТ-ад, лучше подумайте об ответе от armenzg - person lowtech; 25.05.2017
comment
@lowtech, за исключением того, что не во всех версиях окон доступен редактор групповой политики. Редактирование реестра эффективно выполняет то же самое, автоматизируется, проверяется и универсально. - person Doktor J; 04.12.2019

Посмотреть здесь:

http://msdn.microsoft.com/en-us/library/bb513638.aspx

regedit

DWORD HKLM или HKCU \ Software \ Microsoft \ Windows \ Отчет об ошибках Windows \ DontShowUI = "1"

сделает отчет WER беззвучно. Затем вы можете установить

DWORD HKLM или HKCU \ Software \ Microsoft \ Windows \ Windows Error Reporting \ Disabled = "1"

чтобы он не разговаривал с MS.

person Community    schedule 16.02.2009
comment
У меня работал над исправлением проблемы с агентом сборки VSTS, когда я пытался запускать тесты Selenium. Спасибо! - person Stu1986C; 05.09.2018

Я не уверен, относится ли это к точно такому же диалогу, но вот альтернативный подход от Рэймонд Чен:

DWORD dwMode = SetErrorMode(SEM_NOGPFAULTERRORBOX);
SetErrorMode(dwMode | SEM_NOGPFAULTERRORBOX);
person Luke Quinane    schedule 22.01.2009
comment
Да, такой вызов SetErrorMode предотвращает диалог WER, упомянутый OP. - person Roman Starkov; 03.09.2010
comment
Проблема с SetErrorMode и флагом SEM_NOGPFAULTERRORBOX заключается в том, что он не создает файл дампа и не делает запись в журнале событий Windows. Ваша программа просто бесследно исчезнет при сбое. По этой причине я считаю, что реестр лучше. - person Derek; 03.07.2012
comment
Это работает также для устаревших фреймворков (начиная с WinXP). - person Wolf; 02.07.2015
comment
Согласились, что это нехорошо для отправки. Однако действительно полезно разблокировать нестабильные задачи автоматизации. - person kayleeFrye_onDeck; 07.07.2017

Мне пришлось отключить это для работы по автоматизации выпуска в 64-битной Windows для Firefox, и я сделал следующее:

  • gpedit.msc
  • Конфигурация компьютера -> Административные шаблоны
  • Компоненты Windows -> Отчеты об ошибках Windows
  • Установите для параметра «Предотвращать отображение пользовательского интерфейса для критических ошибок» значение «Включено».

Это похоже на то, что было сделано для отчета об опыте работы с клиентами в: http://www.blogsdna.com/2137/fix-windows-installer-explorer-update-has-stopped-working-in-windows-7.htm

person armenzg    schedule 16.03.2011

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

#include <windows.h>
#include <rtcapi.h>
int exception_handler(LPEXCEPTION_POINTERS p)
{
    printf("Exception detected during the unit tests!\n");
    exit(1);
}
int runtime_check_handler(int errorType, const char *filename, int linenumber, const char *moduleName, const char *format, ...)
{
    printf("Error type %d at %s line %d in %s", errorType, filename, linenumber, moduleName);
    exit(1);
}

int main()
{
    DWORD dwMode = SetErrorMode(SEM_NOGPFAULTERRORBOX);
    SetErrorMode(dwMode | SEM_NOGPFAULTERRORBOX);
    SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)&exception_handler); 
    _RTC_SetErrorFunc(&runtime_check_handler);

    // Run your tests here

    return 0;
}
person Gearoid Murphy    schedule 27.03.2013

В приложении WPF

[DllImport("kernel32.dll", SetLastError = true)]
static extern int SetErrorMode(int wMode);

[DllImport("kernel32.dll")]
static extern FilterDelegate SetUnhandledExceptionFilter(FilterDelegate lpTopLevelExceptionFilter);
public delegate bool FilterDelegate(Exception ex);

public static void DisableChashReport()
{
 FilterDelegate fd = delegate(Exception ex)
 {
  return true;
 };
 SetUnhandledExceptionFilter(fd);
 SetErrorMode(SetErrorMode(0) | 0x0002 );
}
person Francesco Germinara    schedule 29.05.2013
comment
Не похоже, что там есть что-то специфичное для WPF, и, похоже, оно отлично работает и в моем консольном приложении (.NET 4.6.2 в Windows 10) - person mookid8000; 15.04.2019

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

Если вы используете безопасный CRT, вам также необходимо предоставить свой собственный обработчик недопустимых параметров и установить его с помощью _ set_invalid_parameter_handler ().

Это сообщение в блоге также содержит некоторую информацию: http://blog.kalmbachnet.de/?postid=75 < / а>

person Stefan    schedule 28.12.2008

Во время теста вы можете работать с подключенным отладчиком, например ADPlus, который может быть настроен многими полезными способами для сбора данных (минидампов) об ошибках и, тем не менее, для предотвращения проблем модального диалога, о которых вы указали выше.

Если вы хотите получить полезную информацию при сбое вашего приложения в производственной среде, вы можете настроить Microsoft Отчет об ошибках, чтобы получить что-то похожее на данные ADPlus.

person Steve Steiner    schedule 28.12.2008

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

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

Сценарий выглядит следующим образом:

sleep_duration = 60000 ; how often to check, in milliseconds.
                       ; 60000 is a full minute

Loop
{
    IfWinExist, ahk_class #32770 ; use autohotkey's window spy to confirm that
                ; ahk_class #32770 is it for you. This seemed to be consistent
                ; across all errors like this on Windows Server 2008
    {
        ControlClick, Button2, ahk_class #32770 ; sends the click.
                ; Button2 is the control name and then the following
                ; is that window name again
    }
    Sleep, sleep_duration ; wait for the time set above
}

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

person Nick    schedule 20.08.2012

Попробовав все остальное в Интернете, чтобы избавиться от своевременного отладчика, я нашел простой способ, который действительно работал и, надеюсь, поможет кому-то другому.

Перейдите в панель управления. Перейдите в раздел "Администрирование". Перейдите к службам. Посмотрите список Machine Debug Manager. Щелкните правой кнопкой мыши по нему и выберите "Свойства". На вкладке "Общие" найдите "Тип запуска". Нажмите "Отключить". Нажмите Применить и ОК.

С тех пор я не видел сообщения отладчика, и мой компьютер работает отлично.

person Vicki Mollenauer    schedule 13.07.2010

Вместо изменения значений в реестре вы можете полностью отключить отчеты об ошибках в Windows Server 2008 R2, Windows Server 2012 и Windows 8 с помощью: serverWerOptin /disable

https://technet.microsoft.com/en-us/library/hh875648(v=ws.11).aspx

person Sven Mawby    schedule 27.10.2014