78

Kiedy an awarii aplikacji na Windows i debugger, takich jak Visual Studio zainstalowany jest następujący dialog modalne okno:Jak wyłączyć okno dialogowe "Debuguj/Zamknij aplikację" w systemie Windows Vista?

[Tytuł: Microsoft Windows]

X przestał działać

problem spowodowany program do poprawnego działania . System Windows zamknie program i powiadomi Cię, jeśli dostępne jest rozwiązanie .

[Debug] [Close Aplikacja]

Czy istnieje sposób, aby wyłączyć to okno? Oznacza to, że program po prostu się zawiesza i pali cicho?

Mój scenariusz jest taki, że chciałbym przeprowadzić kilka automatycznych testów, z których niektóre ulegną awarii z powodu błędów w testowanej aplikacji. Nie chcę, aby te okna dialogowe blokowały przebieg automatyzacji.

wyszukiwanie wokół myślę, że znajduje się rozwiązanie dla wyłączenie to na Windows XP, który jest nuking tego przycisku REG

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

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

+0

nuking klawisz AeDebug \ Debugger nie miał żadnego wpływu na mnie pod Windows XP, albo z konsolą Aplikacje skompilowane z bibliotekami debugowania lub nie debugowania. – rptb1

Odpowiedz

52

Aby wymusić Windows Error Reporting (WER) do podjęcia zrzut awaryjny i zamknąć aplikację, zamiast z prośbą o debugowanie programu, można ustawić te 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 to jest ustawione, gdy Twoje aplikacje ulegną awarii, powinieneś zobaczyć * .hdmp i *.Pliki mdmp w:

%ALLUSERSPROFILE%\Microsoft\Windows\WER\ 
+3

DefaultConsent = 1 wydaje się być domyślny. A co z DontShowUI? – Zitrax

+0

Dokumentacja ForceQueue jest niejasna, nie rozumiem dokładnie, co to znaczy. – Zitrax

+0

Ustawienie trzech wartości dla mnie działa: ForceQueue, DefaultConsent i DontShowUI. Ten ostatni był potrzebny. Ale nie widzę żadnego z wymienionych plików * .hdmp lub * .mdmp. Ale dziennik zdarzeń zawiera błędy, tak jak zawsze. Ale przynajmniej teraz moja usługa nie jest zawieszona. –

4

Podczas testu można uruchomić z 'debugger' like ADPlus attached które można skonfigurować na wiele przydatnych sposobów gromadzenia danych (minizrzuty) na błędy i jeszcze zapobiec modalnych problemów Dialog cię stan powyżej.

Jeśli chcesz uzyskać przydatne informacje o awarii aplikacji podczas produkcji, możesz skonfigurować Microsoft Error reporting, aby uzyskać coś podobnego do danych ADPlus.

32

Nie jestem pewien, czy to odnosi się dokładnie w tym samym oknie, ale tutaj jest alternatywne podejście od Raymond Chen:

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

Tak, wywołanie SetErrorMode w ten sposób zapobiega dialogowi WER wspomnianego przez OP. –

+0

Ładne, czyste rozwiązanie! Dzięki! – kizzx2

+2

Problem, który mam z SetErrorMode i flagą SEM_NOGPFAULTERRORBOX, polega na tym, że nie tworzy on pliku zrzutu i nie tworzy wpisu w dzienniku zdarzeń systemu Windows. Twój program zniknie bez śladu, gdy się zawiesi. Z tego powodu myślę, że rozwiązanie rejestru jest lepsze. – Derek

41

Zobacz tutaj:

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

regedit

DWORD HKLM lub HKCU \ Oprogramowanie \ Microsoft \ Windows \ Windows Raportowanie błędów \ DontShowUI = "1"

spowoduje, że WER po cichu zarejestruje się. Następnie można ustawić

DWORD HKLM lub HKCU \ Software \ Microsoft \ Windows \ Windows Error Reporting \ Wyłączone = "1"

powstrzymać go od mówienia do MS.

3

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

Przejdź do Panel sterowania przejdź do Narzędzia administracyjne Idź do Usług Spójrz w dół listę dla Mdm.exe kliknij prawym przyciskiem myszy, a następnie kliknij przycisk Właściwości na karcie Ogólne, poszukaj Start Up Rodzaj Kliknij na Disable . Kliknij Zastosuj i OK.

Nie widziałem wiadomości od debuggera, a mój komputer działa idealnie.

26

musiałem wyłączyć ten do pracy automatyki uwalnianiu w Windows 64-bity dla Firefoksa i zrobiłem, co następuje:

  • gpedit.msc
  • Konfiguracja komputera -> Szablony administracyjne
  • Składniki systemu Windows - > Raportowanie błędów systemu Windows
  • Set „zapobiegać wyświetlanie interfejsu użytkownika dla błędów krytycznych” Włączone

Jest ona podobna do tego, co zostało dokonane zgłoszenie w Customer Experience: http://www.blogsdna.com/2137/fix-windows-installer-explorer-update-has-stopped-working-in-windows-7.htm

4

Nie jest to bezpośrednia odpowiedź na pytanie, ponieważ jest to obejście i pytanie o to, jak wyłączyć tę funkcję, ale w moim przypadku, Jestem użytkownikiem na serwerze z ograniczonymi uprawnieniami i nie mogę wyłączyć tej funkcji za pomocą jednej z pozostałych odpowiedzi. Potrzebowałem obejścia. Prawdopodobnie zadziała to przynajmniej dla niektórych, którzy kończą na tym pytaniu.

Użyłem autohotkey portable i utworzyłem makro, które raz na minutę sprawdza, czy okno podręczne istnieje, a jeśli tak, klika przycisk, aby zamknąć program. W moim przypadku jest to wystarczające i pozostawia funkcję dla innych użytkowników. Wymaga uruchomienia skryptu po uruchomieniu programu wysokiego ryzyka, ale działa on zgodnie z moimi potrzebami.

Scenariusz jest następujący:

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: Szybkie flagi. Kiedy inne rzeczy się pojawiają, wydaje się, że próbują aktywować kontrolki w oknie pierwszego planu - ma to przesłać go do programu w tle. Jeśli znajdę poprawkę, zredaguję tę odpowiedź, aby to odzwierciedlić, ale na razie bądź ostrożny przy jej używaniu i próbuj wykonywać inne czynności na komputerze w tym samym czasie.

11

W moim kontekście chcę tylko wyłączyć popup dla moich testów jednostkowych, a nie dla całego systemu. Zauważyłem, że kombinacja funkcji jest potrzebna, aby zlikwidować te błędy, takie jak przechwytywanie nieobsługiwanych wyjątków, tłumienie sprawdzeń w czasie pracy (takich jak ważność wskaźnika stosu) i flagi trybu błędu. To właśnie 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; 
} 
6

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); 
} 
Powiązane problemy