webentwicklung-frage-antwort-db.com.de

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

Wenn eine Anwendung unter Windows abstürzt und ein Debugger wie Visual Studio installiert ist, wird das folgende modale Dialogfeld 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, stürzt das Programm einfach ab und brennt lautlos?

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

Ich glaube, ich habe die Lösung gefunden, um dies unter Windows XP zu deaktivieren.

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

Unter Windows Vista funktionierte das jedoch nicht.

83
Chris Smith

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

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 bei einem Absturz Ihrer Apps * .hdmp- und * .mdmp-Dateien angezeigt werden in:

%ALLUSERSPROFILE%\Microsoft\Windows\WER\
54
NicJ

Siehe hier:

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

regedit

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

werde lautlos darüber berichten. Dann kannst du einstellen

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

zu verhindern, dass es mit MS spricht.

45
Adrian

Ich bin mir nicht sicher, ob es sich um genau denselben Dialog handelt, aber hier ist ein alternativer Ansatz von Raymond Chen :

DWORD dwMode = SetErrorMode(SEM_NOGPFAULTERRORBOX);
SetErrorMode(dwMode | SEM_NOGPFAULTERRORBOX);
35
Luke Quinane

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

  • gpedit.msc
  • Computerkonfiguration -> Administrative Vorlagen
  • Windows-Komponenten -> Windows-Fehlerberichterstattung
  • Setzen Sie "Anzeige der Benutzeroberfläche bei kritischen Fehlern verhindern" auf Aktiviert

Ähnliches gilt für die Berichterstellung zur Kundenerfahrung in: http://www.blogsdna.com/2137/fix-windows-installer-Explorer-update-has-stopped-working-in-windows-7. htm

27
armenzg

In meinem Kontext möchte ich das Popup nur für meine Unit-Tests 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 Fehlermodusflags. 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;
}
12
Gearoid Murphy

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 );
}
8

Dies ist keine direkte Antwort auf die Frage, da es sich um eine Problemumgehung handelt und es sich um die Deaktivierung dieser Funktion handelt. In meinem Fall bin ich jedoch ein Benutzer auf einem Server mit eingeschränkten Berechtigungen und kann die Funktion nicht mit einer der folgenden Methoden deaktivieren die anderen Antworten. Also brauchte ich einen Workaround. Dies wird wahrscheinlich zumindest für einige andere funktionieren, die sich mit dieser Frage auseinandersetzen.

Ich habe autohotkey portable verwendet und ein Makro erstellt, das einmal pro Minute prüft, ob das Popup-Fenster existiert, 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 Bedürfnisse.

Das Skript sieht wie folgt aus:

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: Eine schnelle Flagge. Wenn andere Dinge erledigt sind, scheint dies zu versuchen, Steuerelemente im Vordergrundfenster zu aktivieren - es soll sie an das Programm im Hintergrund 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.

4
Nick

Sie müssen einen nicht behandelten Ausnahmefilter implementieren, der Ihre Anwendung einfach beendet, und dann diese Filterfunktion mit SetUnhandledExceptionFilter () einstellen.

Wenn Sie die sichere CRT verwenden, müssen Sie auch einen eigenen ungültigen Parameterhandler bereitstellen und diesen mit _ set_invalid_parameter_handler () festlegen.

Dieser Blog-Beitrag enthält auch einige Informationen: http://blog.kalmbachnet.de/?postid=75

4
Stefan

Während des Tests können Sie mit einem 'Debugger' wie ADPlus im Anhang arbeiten, das auf viele nützliche Arten konfiguriert werden kann, um Daten (Minidumps) zu Fehlern zu sammeln 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 Microsoft Error Reporting konfigurieren, um ähnliche Informationen wie ADPlus-Daten abzurufen.

4
Steve Steiner

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, jemand anderem zu helfen.

Gehen Sie zur Systemsteuerung. Gehen Sie zu Verwaltung. Gehen 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-Meldung seitdem nicht mehr gesehen und mein Computer läuft einwandfrei.

3

Anstatt die Werte in der Registrierung zu ändern, können Sie die Fehlerberichterstattung unter Windows Server 2008 R2, Windows Server 2012 und Windows 8 mit folgendem Befehl vollständig deaktivieren: serverWerOptin /disable

https://technet.Microsoft.com/en-us/library/hh875648 (v = ws.11) .aspx

1
fr34kyn01535