Як вимкнути діалогове вікно "Налагодження / закриття програми" в Windows Vista?


86

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

[Назва: Microsoft Windows]

X перестав працювати

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

[Налагодження] [Закрити програму]

Чи є спосіб вимкнути це діалогове вікно? Тобто, програма просто виходила з ладу і мовчки горіла?

Мій сценарій полягає в тому, що я хотів би запустити кілька автоматизованих тестів, деякі з яких вийдуть з ладу через помилки в тестованому додатку. Я не хочу, щоб ці діалоги зупиняли автоматизацію.

Шукаючи навколо, я думаю, що я знайшов рішення для відключення цього в Windows XP, який нукує цей ключ reg:

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

Однак це не спрацювало в Windows Vista.


Нукція клавіші AeDebug \ Debugger не мала ніякого ефекту для мене під Windows XP, ні в консольних програмах, скомпільованих з бібліотеками налагодження, ні без налагодження.
rptb1

Відповіді:


56

Щоб змусити Звітування про помилки 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\

3
DefaultConsent = 1 здається типовим. А як щодо DontShowUI?
Zitrax

Документація ForceQueue розмита, я не розумію точно, що це означає.
Zitrax

2
@NicJ, будь ласка, додай DontShowUI = 1 до своєї відповіді, вона є основною
Youda008

1
Можна також встановити під HKEY_CURRENT_USER, я вважаю
PJTraill

2
Редагування реєстру Windows - це шлях до ІТ-пекла, краще розгляньте відповідь від armenzg
lowtech

45

Дивіться тут:

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

regedit

DWORD HKLM або HKCU \ Software \ Microsoft \ Windows \ Windows Звітування про помилки \ DontShowUI = "1"

змусить WER мовчки повідомляти. Тоді ви можете встановити

DWORD HKLM або HKCU \ Software \ Microsoft \ Windows \ Windows Звітування про помилки \ Вимкнено = "1"

щоб зупинити його від розмови з РС.


Працював для мене при виправленні проблеми з агентом побудови VSTS, коли я намагався запустити тести на селен. Дякую!
Stu1986C

36

Я не впевнений, що це стосується точно того самого діалогу, але ось альтернативний підхід від Реймонда Чена :

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

Так, такий виклик SetErrorMode заважає діалогу WER, згаданому в OP.
Роман Старков

2
Проблема, яку я маю з SetErrorMode і прапором SEM_NOGPFAULTERRORBOX, полягає в тому, що він не створює файл дампа і не робить запис у журналі подій Windows. Ваша програма просто зникне без сліду при аварії. З цієї причини я думаю, що рішення реєстру є кращим.
Дерек

Це працює також для застарілих фреймворків (починаючи з WinXP).
Wolf

1
Погодився з тим, що з цим не годиться відправляти. Однак справді корисно розблокувати нестабільні завдання автоматизації.
kayleeFrye_onDeck

31

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

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

Подібне те, що було досягнуто для звітування про взаємодію з клієнтами в: http://www.blogsdna.com/2137/fix-windows-installer-explorer-update-has-stopped-working-in-windows-7.htm


13

У моєму контексті я хочу лише придушити спливаюче вікно для своїх модульних тестів, а не для всієї системи. Я виявив, що для придушення цих помилок потрібна комбінація функцій, наприклад, вловлювання необроблених винятків, придушення перевірок часу виконання (наприклад, дійсності вказівника стека) та прапорів режиму помилок. Це те, що я використовував з певним успіхом:

#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

У додатку 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 );
}

Не схоже, що там є щось специфічне для WPF, і, здається, це прекрасно працює і в моєму консольному додатку (.NET 4.6.2 у Windows 10)
mookid8000,

4

Вам потрібно реалізувати фільтр необроблених винятків, який просто виходить із програми, а потім встановлює цю функцію фільтра за допомогою SetUnhandledExceptionFilter () .

Якщо ви використовуєте безпечну ЕПТ, вам також слід надати власний обробник недійсних параметрів і встановити його за допомогою _set_invalid_parameter_handler ().

У цьому дописі в блозі також є деяка інформація: http://blog.kalmbachnet.de/?postid=75


4

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

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


4

Це не пряма відповідь на запитання, оскільки це обхідний шлях, і питання полягає в тому, як відключити цю функцію, але в моєму випадку я користувач на сервері з обмеженими дозволами і не можу вимкнути цю функцію за допомогою одного з інші відповіді. Отже, мені знадобився обхідний шлях. Це, швидше за все, спрацює принаймні для деяких інших, хто опиниться у цьому питанні.

Я використав портативну програму 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
}

редагувати: Швидкий прапор. Коли інші речі виникають, це, схоже, намагається активувати елементи керування у вікні переднього плану - це має надіслати його програмі у фоновому режимі. Якщо я знайду виправлення, я відредагую цю відповідь, щоб відобразити це, але поки що будьте обережні, використовуючи це та намагаючись одночасно виконувати інші роботи на машині.


3

Спробувавши все інше в Інтернеті, щоб позбутися своєчасно налагоджувача, я знайшов простий спосіб, який насправді працював, і, сподіваюся, допоможе комусь іншому.

Перейдіть до Панелі керування Перейдіть до Адміністративні інструменти Перейдіть до Служб. Перегляньте список Диспетчера налагодження машини. Клацніть правою кнопкою миші та клацніть на Властивості На вкладці Загальне знайдіть Тип запуску Клацніть на Вимкнути. Клацніть на Застосувати та ОК.

З тих пір я не бачив повідомлення налагоджувача, і мій комп’ютер працює ідеально.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.