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

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

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

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

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

[Debug][Закрыть Приложение]

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

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

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

HKLMSoftwareMicrosoftWindows NTCurrentVersionAeDebugDebugger

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

11 ответов


чтобы заставить Windows Error Reporting (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\

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

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\Disabled = "1"

чтобы остановить его от разговора с г -


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

DWORD dwMode = SetErrorMode(SEM_NOGPFAULTERRORBOX);
SetErrorMode(dwMode | SEM_NOGPFAULTERRORBOX);

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

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

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


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

#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;
}

в приложении 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 );
}

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

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

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


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

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


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

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

скрипт выглядит следующим образом:

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
}

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


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

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

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


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

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