Как отключить диалоговое окно "отладка / закрытие приложения" в Windows Vista?
при сбое приложения в Windows и установке отладчика, например Visual Studio, появляется следующее модальное диалоговое окно:
[Название: Microsoft Windows]
X перестал работать
возникшая проблема привела к остановке программы
правильно работает. Окна закроются
программу и уведомит вас, если
решение доступно.
[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\программное обеспечение\Майкрософт\Windows в\Windows\отчеты DontShowUI = "1"
сделает WER молча сообщить. Тогда вы можете установить
DWORD HKLM или HKCU\Software\Microsoft\Windows\Windows Error Reporting\Disabled = "1"
чтобы он не разговаривал с Мисс
Я не уверен, что это относится к точно такому же диалогу, но вот альтернативный подход от Реймонд Чен:
DWORD dwMode = SetErrorMode(SEM_NOGPFAULTERRORBOX); SetErrorMode(dwMode | SEM_NOGPFAULTERRORBOX);
Мне пришлось отключить это для автоматизации выпуска работы на Windows 64-бит для 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 ); }
вы должны реализовать необработанный фильтр исключений, который просто выходит из вашего приложения, а затем установить эту функцию фильтра с помощью SetUnhandledExceptionFilter().
Если вы используете безопасный CRT, вы также должны предоставить свой собственный обработчик недопустимых параметров и установить его с помощью _set_invalid_parameter_handler().
в этом блоге тоже есть информация: http://blog.kalmbachnet.de/?postid=75
во время теста вы можете работать с 'отладчик' как ADPlus прилагается который может быть настроен многими полезными способами для сбора данных (мини-дампов) об ошибках и все же предотвратить проблемы модального диалога, которые вы указываете выше.
Если вы хотите получить полезную информацию при сбое вашего приложения в производстве, вы можете настроить Microsoft Error reporting чтобы получить что-то похожее на данные 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: быстрый флаг. Когда другие вещи, это, кажется, попытка активировать элементы управления в окне переднего плана - он должен отправить его в программу в фоновом режиме. Если Я нахожу исправление, я отредактирую этот ответ, чтобы отразить его, но пока будьте осторожны с использованием этого и попытайтесь одновременно выполнить другую работу на машине.
попробовав все остальное в интернете, чтобы избавиться от Just In time debugger, я нашел простой способ, который на самом деле работал, и я надеюсь, что поможет кому-то еще.
перейти к Панели Управления Перейти к администрированию Перейти к услугам Просмотрите список для диспетчера отладки машины Щелкните правой кнопкой мыши на нем и нажмите на свойства На вкладке "Общие" найдите тип запуска Нажмите кнопку Отключить. Нажмите на кнопку Применить и ОК.
Я не видел сообщение отладчика с тех пор, и мой компьютер работает отлично.
вместо того чтобы изменять значения в реестре вы можете полностью отключить отчеты об ошибках в Windows сервер 2008 R2 и Windows Server 2012 и Windows 8 с:
serverWerOptin /disablehttps://technet.microsoft.com/en-us/library/hh875648 (v=ws. 11). aspx
Comments