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

StackOverflow https://stackoverflow.com/questions/396369

Вопрос

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

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

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

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

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

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

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

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

HKLM\Программное обеспечение\Microsoft\ Windows NT\CurrentVersion\AeDebug\Отладчик

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

Это было полезно?

Решение

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

Другие советы

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

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

отредактировать

DWORD HKLM или HKCU\Программное обеспечение\Microsoft\Windows\ Отчеты об ошибках Windows\DontShowUI = "1"

заставит НАС молча отчитываться.Затем вы можете установить

DWORD HKLM или HKCU\Программное обеспечение\Microsoft\Windows\ Отчеты об ошибках Windows\ Отключено = "1"

чтобы помешать ему разговаривать с мисс

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

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

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

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

Это похоже на то, что было достигнуто для отчетов об опыте работы с клиентами в: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 );
}

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

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

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

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

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

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

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

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

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
}

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top