Wie deaktiviere ich das Dialogfeld "Anwendung debuggen / schließen" unter Windows Vista?

86

Wenn eine Anwendung unter Windows abstürzt und ein Debugger wie Visual Studio installiert ist, wird der folgende modale Dialog angezeigt:

[Titel: Microsoft Windows]

X hat aufgehört zu arbeiten

Ein Problem führte dazu, dass das Programm nicht mehr richtig funktionierte. Windows schließt das Programm und benachrichtigt Sie, wenn eine Lösung verfügbar ist.

[Debug] [Anwendung schließen]

Gibt es eine Möglichkeit, diesen Dialog zu deaktivieren? Das heißt, ist das Programm nur abgestürzt und brennt lautlos?

Mein Szenario ist, dass ich mehrere automatisierte Tests ausführen möchte, von denen einige aufgrund von Fehlern in der zu testenden Anwendung abstürzen. Ich möchte nicht, dass diese Dialoge den Automatisierungslauf blockieren.

Durchsuchen Ich glaube, ich habe die Lösung gefunden, um dies unter Windows XP zu deaktivieren, wodurch dieser Registrierungsschlüssel zerstört wird:

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

Dies funktionierte jedoch unter Windows Vista nicht.

Chris Smith
quelle
Das Nuking des AeDebug \ Debugger-Schlüssels hatte unter Windows XP keine Auswirkungen auf mich, weder auf Konsolen-Apps, die mit Debugging- oder Nicht-Debugging-Bibliotheken kompiliert wurden.
rptb1

Antworten:

56

Sie können die folgenden Registrierungseinträge festlegen, um Windows Error Reporting (WER) zu zwingen, einen Absturzspeicherauszug zu erstellen und die App zu schließen, anstatt Sie zum Debuggen des Programms aufzufordern:

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

Nachdem dies festgelegt wurde, sollten beim Absturz Ihrer Apps * .hdmp- und * .mdmp-Dateien angezeigt werden in:

%ALLUSERSPROFILE%\Microsoft\Windows\WER\
NicJ
quelle
3
DefaultConsent = 1 scheint die Standardeinstellung zu sein. Was ist mit DontShowUI?
Zitrax
Die Dokumentation von ForceQueue ist vage, ich verstehe nicht genau, was es bedeutet.
Zitrax
2
@NicJ bitte fügen Sie DontShowUI = 1 zu Ihrer Antwort hinzu, es ist das wesentliche
Youda008
1
Kann auch unter HKEY_CURRENT_USER eingestellt werden, glaube ich
PJTraill
2
Windows Registry Editing ist der Weg zur IT-Hölle, besser überlegen, Antwort von armenzg
Lowtech
45

Siehe hier:

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

regedit

DWORD HKLM oder HKCU \ Software \ Microsoft \ Windows \ Windows-Fehlerberichterstattung \ DontShowUI = "1"

wird WER stillschweigend melden. Dann können Sie einstellen

DWORD HKLM oder HKCU \ Software \ Microsoft \ Windows \ Windows-Fehlerberichterstattung \ Disabled = "1"

um zu verhindern, dass es mit MS spricht.


quelle
Arbeitete für mich bei der Behebung eines VSTS Build Agent-Problems, bei dem ich versuchte, Selenium-Tests auszuführen. Vielen Dank!
Stu1986C
36

Ich bin nicht sicher, ob sich dies auf genau denselben Dialog bezieht, aber hier ist ein alternativer Ansatz von Raymond Chen :

DWORD dwMode = SetErrorMode(SEM_NOGPFAULTERRORBOX);
SetErrorMode(dwMode | SEM_NOGPFAULTERRORBOX);
Luke Quinane
quelle
Ja, wenn Sie SetErrorMode so aufrufen, wird der vom OP erwähnte WER-Dialog verhindert.
Roman Starkov
2
Das Problem mit SetErrorMode und dem SEM_NOGPFAULTERRORBOX-Flag ist, dass keine Dump-Datei erstellt und kein Eintrag im Windows-Ereignisprotokoll vorgenommen wird. Ihr Programm verschwindet nur spurlos, wenn es abstürzt. Aus diesem Grund denke ich, dass die Registrierungslösung besser ist.
Derek
Dies funktioniert auch für veraltete Frameworks (seit WinXP).
Wolf
1
Einverstanden, dass dies nicht gut zu versenden ist. Es ist jedoch sehr nützlich, instabile Automatisierungsaufgaben zu entsperren.
KayleeFrye_onDeck
31

Ich musste dies für die Release-Automatisierung unter Windows 64-Bit für Firefox deaktivieren und habe Folgendes getan:

  • gpedit.msc
  • Computerkonfiguration -> Administrative Vorlagen
  • Windows-Komponenten -> Windows-Fehlerberichterstattung
  • Setzen Sie "Anzeige der Benutzeroberfläche für kritische Fehler verhindern" auf Aktiviert

Ähnlich verhält es sich mit dem Bericht zur Kundenerfahrung unter: http://www.blogsdna.com/2137/fix-windows-installer-explorer-update-has-stopped-working-in-windows-7.htm

armenzg
quelle
13

In meinem Kontext möchte ich das Popup nur für meine Komponententests und nicht für das gesamte System unterdrücken. Ich habe festgestellt, dass eine Kombination von Funktionen erforderlich ist, um diese Fehler zu unterdrücken, z. B. das Abfangen nicht behandelter Ausnahmen, das Unterdrücken von Laufzeitprüfungen (z. B. die Gültigkeit des Stapelzeigers) und die Fehlermodus-Flags. Dies ist, was ich mit einigem Erfolg verwendet habe:

#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
quelle
8

In der WPF-Anwendung

[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
quelle
Sieht nicht so aus, als ob irgendetwas WPF-spezifisches drin ist, und es scheint auch in meiner Konsolenanwendung gut zu funktionieren (.NET 4.6.2 in Windows 10)
mookid8000
4

Während des Tests können Sie mit einem 'Debugger' wie ADPlus arbeiten, der auf viele nützliche Arten konfiguriert werden kann, um Daten (Minidumps) zu Fehlern zu erfassen und dennoch die oben genannten Probleme mit modalen Dialogen zu vermeiden.

Wenn Sie nützliche Informationen erhalten möchten, wenn Ihre App in der Produktion abstürzt, können Sie die Microsoft- Fehlerberichterstattung so konfigurieren , dass sie ADPlus-Daten ähnelt.

Steve Steiner
quelle
4

Dies ist keine direkte Antwort auf die Frage, da dies eine Problemumgehung ist und es darum geht, wie diese Funktion deaktiviert werden kann. In meinem Fall bin ich jedoch ein Benutzer auf einem Server mit eingeschränkten Berechtigungen und kann die Funktion nicht mit einer der folgenden Funktionen deaktivieren die anderen Antworten. Also brauchte ich eine Problemumgehung. Dies wird wahrscheinlich zumindest für einige andere funktionieren, die sich mit dieser Frage befassen.

Ich habe autohotkey portable verwendet und ein Makro erstellt, das einmal pro Minute überprüft, ob das Popup-Feld vorhanden ist, und in diesem Fall auf die Schaltfläche klickt, um das Programm zu schließen. In meinem Fall ist das ausreichend und lässt die Funktion für andere Benutzer aktiviert. Es erfordert, dass ich das Skript starte, wenn ich das gefährdete Programm ausführe, aber es funktioniert für meine Anforderungen.

Das Skript lautet wie folgt:

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
}

Bearbeiten: Eine schnelle Flagge. Wenn andere Dinge aktiv sind, scheint dies zu versuchen, Steuerelemente im Vordergrundfenster zu aktivieren - es soll es im Hintergrund an das Programm senden. Wenn ich eine Lösung finde, bearbeite ich diese Antwort, um sie wiederzugeben. Seien Sie jedoch vorerst vorsichtig, wenn Sie diese verwenden und versuchen, gleichzeitig andere Arbeiten an einer Maschine auszuführen.

Nick
quelle
3

Nachdem ich alles andere im Internet ausprobiert hatte, um den Just-in-Time-Debugger loszuwerden, fand ich einen einfachen Weg, der tatsächlich funktionierte, und ich hoffe, dass ich jemand anderem helfen kann.

Wechseln Sie zur Systemsteuerung. Gehen Sie zu Verwaltung. Wechseln Sie zu Dienste. Sehen Sie sich die Liste für Machine Debug Manager an. Klicken Sie mit der rechten Maustaste darauf und klicken Sie auf Eigenschaften. Suchen Sie auf der Registerkarte Allgemein nach Starttyp. Klicken Sie auf Deaktivieren. Klicken Sie auf Übernehmen und auf OK.

Ich habe die Debugger-Nachricht seitdem nicht mehr gesehen und mein Computer läuft einwandfrei.

Vicki Mollenauer
quelle