Jak wyłączyć okno dialogowe „Debuguj / Zamknij aplikację” w systemie Windows Vista?

86

Gdy aplikacja ulegnie awarii w systemie Windows i zostanie zainstalowany debugger, taki jak Visual Studio, pojawi się następujące modalne okno dialogowe:

[Tytuł: Microsoft Windows]

X przestał działać

Problem spowodował, że program przestał działać poprawnie. System Windows zamknie program i powiadomi Cię, jeśli dostępne będzie rozwiązanie.

[Debuguj] [Zamknij aplikację]

Czy istnieje sposób na wyłączenie tego okna dialogowego? To znaczy, czy program po prostu się zawiesił i cicho nagrywał?

Mój scenariusz jest taki, że chciałbym uruchomić kilka testów automatycznych, z których część ulegnie awarii z powodu błędów w testowanej aplikacji. Nie chcę, aby te okna dialogowe opóźniały działanie automatyzacji.

Przeszukując okolice, wydaje mi się, że znalazłem rozwiązanie umożliwiające wyłączenie tego w systemie Windows XP, czyli nukowanie tego klucza reg:

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

Jednak to nie zadziałało w systemie Windows Vista.

Chris Smith
źródło
Nukowanie klucza AeDebug \ Debugger nie przyniosło mi żadnego efektu w systemie Windows XP, ani w aplikacjach konsolowych skompilowanych z bibliotekami debugującymi, ani nie-debugującymi.
rptb1

Odpowiedzi:

56

Aby zmusić raportowanie błędów systemu Windows (WER) do wykonania zrzutu awaryjnego i zamknięcia aplikacji, zamiast wyświetlać monit o debugowanie programu, możesz ustawić następujące wpisy rejestru:

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

Po ustawieniu tego ustawienia, gdy aplikacje ulegną awarii, pliki * .hdmp i * .mdmp powinny być widoczne w:

%ALLUSERSPROFILE%\Microsoft\Windows\WER\
NicJ
źródło
3
DefaultConsent = 1 wydaje się być wartością domyślną. A co z DontShowUI?
Zitrax
Dokumentacja ForceQueue jest niejasna, nie rozumiem dokładnie, co to znaczy.
Zitrax
2
@NicJ proszę dodać DontShowUI = 1 do swojej odpowiedzi, jest to podstawowa
Youda008
1
Można również ustawić pod HKEY_CURRENT_USER, wierzę
PJTraill
2
edycja rejestru windowsa to droga do piekła IT, lepiej rozważ odpowiedź od armenzg
lowtech
45

Spójrz tutaj:

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

regedit

DWORD HKLM lub HKCU \ Software \ Microsoft \ Windows \ Windows Error Reporting \ DontShowUI = „1”

sprawi, że WER po cichu poinformuje. Następnie możesz ustawić

DWORD HKLM lub HKCU \ Software \ Microsoft \ Windows \ Windows Error Reporting \ Disabled = „1”

powstrzymać go od rozmowy z SM.


źródło
Pracował dla mnie przy naprawianiu problemu VSTS Build Agent, w którym próbowałem uruchomić testy Selenium. Dzięki!
Stu1986C
36

Nie jestem pewien, czy dotyczy to dokładnie tego samego okna dialogowego, ale tutaj jest alternatywne podejście Raymonda Chena :

DWORD dwMode = SetErrorMode(SEM_NOGPFAULTERRORBOX);
SetErrorMode(dwMode | SEM_NOGPFAULTERRORBOX);
Luke Quinane
źródło
Tak, wywołanie SetErrorMode w ten sposób zapobiega wyświetlaniu okna dialogowego WER wspomnianego przez OP.
Roman Starkov
2
Problem, który mam z SetErrorMode i flagą SEM_NOGPFAULTERRORBOX polega na tym, że nie tworzy pliku zrzutu i nie dokonuje wpisu w dzienniku zdarzeń systemu Windows. Twój program po prostu zniknie bez śladu, gdy ulegnie awarii. Z tego powodu uważam, że rozwiązanie rejestru jest lepsze.
Derek
Działa to również w przypadku przestarzałych frameworków (od czasu WinXP).
Wolf
1
Zgodziłem się, że to nie jest dobre do wysyłania. Jednak naprawdę przydatne jest odblokowanie niestabilnych zadań automatyzacji.
kayleeFrye_onDeck,
31

Musiałem to wyłączyć, aby automatyzacja wydań działała w 64-bitowym systemie Windows dla przeglądarki Firefox i wykonałem następujące czynności:

  • gpedit.msc
  • Konfiguracja komputera -> Szablony administracyjne
  • Składniki systemu Windows -> Raportowanie błędów systemu Windows
  • Ustaw opcję „Zapobiegaj wyświetlaniu interfejsu użytkownika w przypadku błędów krytycznych” na Włączone

Podobnie jest w przypadku raportowania Customer Experience w: http://www.blogsdna.com/2137/fix-windows-installer-explorer-update-has-stopped-working-in-windows-7.htm

armenzg
źródło
13

W moim kontekście chcę tylko pominąć wyskakujące okienko dla moich testów jednostkowych, a nie dla całego systemu. Odkryłem, że w celu wyeliminowania tych błędów potrzebna jest kombinacja funkcji, takich jak przechwytywanie nieobsłużonych wyjątków, blokowanie kontroli czasu wykonywania (takich jak poprawność wskaźnika stosu) i flagi trybu błędu. Oto, czego użyłem z pewnym sukcesem:

#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;
}
Gearoid Murphy
źródło
8

W aplikacji 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 );
}
Francesco Germinara
źródło
Wygląda na to, że nie ma tam nic specyficznego dla WPF i wydaje się, że działa dobrze również w mojej aplikacji konsoli (.NET 4.6.2 w systemie Windows 10)
mookid8000
4

Podczas testu można uruchomić z dołączonym „debugerem”, takim jak ADPlus, który można skonfigurować na wiele użytecznych sposobów, aby zbierać dane (minizrzuty) o błędach, a jednocześnie zapobiegać problemom z modalnym oknem dialogowym, które opisaliście powyżej.

Jeśli chcesz uzyskać przydatne informacje, gdy Twoja aplikacja ulegnie awarii w środowisku produkcyjnym, możesz skonfigurować raportowanie błędów firmy Microsoft, aby uzyskać coś podobnego do danych ADPlus.

Steve Steiner
źródło
4

To nie jest bezpośrednia odpowiedź na to pytanie, ponieważ jest to obejście i pytanie dotyczy sposobu wyłączenia tej funkcji, ale w moim przypadku jestem użytkownikiem na serwerze z ograniczonymi uprawnieniami i nie mogę wyłączyć tej funkcji za pomocą jednego z inne odpowiedzi. Więc potrzebowałem obejścia. Prawdopodobnie zadziała to przynajmniej w przypadku niektórych innych, którzy skończą z tym pytaniem.

Kiedyś AutoHotkey przenośny i stworzony makro, które raz na minute sprawdza, czy okno popup istnieje, a jeśli tak, to kliknie przycisk, aby zamknąć program. W moim przypadku to wystarczy i pozostawia tę funkcję włączoną dla innych użytkowników. Wymaga to uruchomienia skryptu, gdy uruchamiam zagrożony program, ale działa dla moich potrzeb.

Skrypt wygląda następująco:

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
}

edycja: szybka flaga. Kiedy inne rzeczy są aktywne, wydaje się, że próbuje to aktywować kontrolki w oknie pierwszego planu - ma wysłać to do programu w tle. Jeśli znajdę poprawkę, edytuję tę odpowiedź, aby ją odzwierciedlić, ale na razie zachowaj ostrożność przy używaniu tego i próbowaniu wykonywania innych prac na komputerze w tym samym czasie.

Nacięcie
źródło
3

Po wypróbowaniu wszystkiego innego w Internecie, aby pozbyć się debuggera just in time, znalazłem prosty sposób, który faktycznie zadziałał i mam nadzieję, że pomoże komuś innemu.

Idź do Panelu sterowania Idź do Narzędzia administracyjne Idź do Usługi Spójrz w dół na listę Machine Debug Manager Kliknij prawym przyciskiem myszy i kliknij Właściwości W zakładce Ogólne poszukaj Typ uruchomienia Kliknij Wyłącz. Kliknij Zastosuj i OK.

Od tego czasu nie widziałem komunikatu debugera, a mój komputer działa idealnie.

Vicki Mollenauer
źródło