it-swarm.com.ru

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

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

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

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

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

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

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

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

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

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

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

83
Chris Smith

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

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

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

смерзаться

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

заставлю БЫТЬ молча отчитаться. Тогда вы можете установить

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

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

45
Adrian

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

DWORD dwMode = SetErrorMode(SEM_NOGPFAULTERRORBOX);
SetErrorMode(dwMode | SEM_NOGPFAULTERRORBOX);
35
Luke Quinane

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

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

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

27
armenzg

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

#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;
}
12
Gearoid Murphy

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

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

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

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

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

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

4
Stefan

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

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

4
Steve Steiner

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

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

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

3
Vicki Mollenauer

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

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

1
fr34kyn01535