Как отключить диалоговое окно «Отладка / закрытие приложения» в Windows Vista? - PullRequest
83 голосов
/ 28 декабря 2008

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

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

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

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

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

Есть ли способ отключить этот диалог? То есть программа просто аварийно завершает работу и горит?

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

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

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

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

Ответы [ 11 ]

54 голосов
/ 28 декабря 2008

Чтобы заставить 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\
45 голосов
/ 17 февраля 2009

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

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.

35 голосов
/ 22 января 2009

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

DWORD dwMode = SetErrorMode(SEM_NOGPFAULTERRORBOX);
SetErrorMode(dwMode | SEM_NOGPFAULTERRORBOX);
27 голосов
/ 16 марта 2011

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

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

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

12 голосов
/ 27 марта 2013

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

#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;
}
8 голосов
/ 29 мая 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 );
}
4 голосов
/ 21 августа 2012

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

Я использовал 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
}

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

4 голосов
/ 28 декабря 2008

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

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

4 голосов
/ 28 декабря 2008

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

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

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

3 голосов
/ 13 июля 2010

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

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

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

...