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

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

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

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

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

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

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

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

Поиск вокруг Я думаю, что я нашел решение для отключения этого в Windows XP, которое запускает этот ключ реестра:

HKLM\Software\Microsoft\Windows NT\CurrentVersion\AeDebug\Debugger

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

Ответ 1

Чтобы заставить 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\

Ответ 2

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

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

смерзаться

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

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

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

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

Ответ 3

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

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

Ответ 4

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

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

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

Ответ 5

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

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

Ответ 6

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

Ответ 7

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

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

В этом сообщении также есть информация: http://blog.kalmbachnet.de/?postid=75

Ответ 8

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

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

Ответ 9

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

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

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

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

Loop
{
    IfWinExist, ahk_class #32770 ; use autohotkey 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
}

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

Ответ 10

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

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

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

Ответ 11

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

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