Come si disabilita la finestra di dialogo "Debug / Chiudi applicazione" su Windows Vista?


86

Quando un'applicazione si arresta in modo anomalo su Windows e viene installato un debugger come Visual Studio, viene visualizzata la seguente finestra di dialogo modale:

[Titolo: Microsoft Windows]

X ha smesso di funzionare

Un problema ha impedito al programma di funzionare correttamente. Windows chiuderà il programma e ti avviserà se è disponibile una soluzione.

[Debug] [Chiudi applicazione]

C'è un modo per disabilitare questa finestra di dialogo? Cioè, il programma si blocca e brucia in silenzio?

Il mio scenario è che vorrei eseguire diversi test automatici, alcuni dei quali andranno in crash a causa di bug nell'applicazione sotto test. Non voglio che queste finestre di dialogo blocchino l'esecuzione dell'automazione.

Cercando in giro penso di aver trovato la soluzione per disabilitarlo su Windows XP, che sta attaccando questa chiave di registro:

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

Tuttavia, ciò non ha funzionato su Windows Vista.


Il nuking della chiave AeDebug \ Debugger non ha avuto alcun effetto su Windows XP, né su app console compilate con librerie di debug che non di debug.
rptb1

Risposte:


56

Per forzare Windows Error Reporting (WER) a eseguire un crash dump e chiudere l'app, invece di chiedere di eseguire il debug del programma, puoi impostare queste voci di registro:

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

Dopo aver impostato questo, quando le tue app si bloccano, dovresti vedere i file * .hdmp e * .mdmp in:

%ALLUSERSPROFILE%\Microsoft\Windows\WER\

3
DefaultConsent = 1 sembra essere l'impostazione predefinita. Che mi dici di DontShowUI?
Zitrax

La documentazione di ForceQueue è vaga, non capisco esattamente cosa significhi.
Zitrax

2
@NicJ per favore aggiungi DontShowUI = 1 alla tua risposta, è quello essenziale
Youda008

1
Può anche essere impostato sotto HKEY_CURRENT_USER, credo
PJTraill

2
la modifica del registro di Windows è la strada per l'inferno IT, è meglio considerare la risposta di armenzg
lowtech

45

Vedere qui:

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

regedit

DWORD HKLM o HKCU \ Software \ Microsoft \ Windows \ Windows Error Reporting \ DontShowUI = "1"

farà rapporto silenziosamente il WER. Quindi puoi impostare

DWORD HKLM o HKCU \ Software \ Microsoft \ Windows \ Windows Error Reporting \ Disabled = "1"

per impedirgli di parlare con la SM.


Ha funzionato per me nella risoluzione di un problema con l'agente di compilazione VSTS in cui stavo cercando di eseguire test di selenio. Grazie!
Stu1986C

36

Non sono sicuro che questo si riferisca esattamente alla stessa finestra di dialogo, ma ecco un approccio alternativo di Raymond Chen :

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

Sì, chiamando SetErrorMode in questo modo si impedisce la finestra di dialogo WER menzionata dall'OP.
Roman Starkov

2
Il problema che ho con SetErrorMode e il flag SEM_NOGPFAULTERRORBOX è che non crea un file di dump e non fa una voce nel registro eventi di Windows. Il tuo programma scomparirà senza lasciare traccia quando si blocca. Per questo motivo penso che la soluzione del registro sia migliore.
Derek

Questo funziona anche per framework obsoleti (da WinXP).
Wolf

1
Concordato che questo non è buono da spedire con. Tuttavia, è davvero utile sbloccare unstable per le attività di automazione.
kayleeFrye_onDeck

31

Ho dovuto disabilitare questo per il lavoro di automazione del rilascio su Windows a 64 bit per Firefox e ho fatto quanto segue:

  • gpedit.msc
  • Configurazione computer -> Modelli amministrativi
  • Componenti di Windows -> Segnalazione errori di Windows
  • Impostare "Impedisci la visualizzazione dell'interfaccia utente per errori critici" su Abilitato

È simile a quanto è stato realizzato per la creazione di report sull'esperienza del cliente in: http://www.blogsdna.com/2137/fix-windows-installer-explorer-update-has-stopped-working-in-windows-7.htm


13

Nel mio contesto, voglio solo sopprimere il popup per i miei unit test e non per l'intero sistema. Ho scoperto che una combinazione di funzioni è necessaria per sopprimere questi errori, come il rilevamento di eccezioni non gestite, l'eliminazione dei controlli in fase di esecuzione (come la validità del puntatore dello stack) e i flag della modalità di errore. Questo è quello che ho usato con un certo successo:

#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

Nell'applicazione 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 );
}

Non sembra che ci sia qualcosa di specifico per WPF lì dentro, e sembra funzionare perfettamente anche nella mia applicazione console (.NET 4.6.2 in Windows 10)
mookid8000


4

Durante il test è possibile eseguire con un "debugger" come ADPlus allegato che può essere configurato in molti modi utili per raccogliere dati (minidump) sugli errori e tuttavia prevenire i problemi di dialogo modale che hai indicato sopra.

Se desideri ottenere alcune informazioni utili quando la tua app si arresta in modo anomalo in produzione, puoi configurare la segnalazione degli errori Microsoft per ottenere qualcosa di simile ai dati di ADPlus.


4

Questa non è una risposta diretta alla domanda poiché si tratta di una soluzione alternativa e la domanda riguarda come disabilitare quella funzione, ma nel mio caso, sono un utente su un server con autorizzazioni limitate e non posso disabilitare la funzione utilizzando uno dei le altre risposte. Quindi, avevo bisogno di una soluzione alternativa. Questo probabilmente funzionerà almeno per alcuni altri che finiranno su questa domanda.

Ho usato autohotkey portable e ho creato una macro che una volta al minuto controlla se la finestra popup esiste e, in caso affermativo , fa clic sul pulsante per chiudere il programma. Nel mio caso, è sufficiente e lascia la funzione attiva per altri utenti. È necessario avviare lo script quando eseguo il programma a rischio, ma funziona per le mie esigenze.

Lo script è il seguente:

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
}

modifica: una bandiera veloce. Quando ci sono altre cose, questo sembra tentare di attivare i controlli nella finestra in primo piano - dovrebbe inviarlo al programma in background. Se trovo una soluzione, modifico questa risposta per rispecchiarla, ma per ora, sii cauto nell'usarlo e provare a fare altri lavori su una macchina allo stesso tempo.


3

Dopo aver provato tutto il resto su Internet per sbarazzarmi del debugger just in time, ho trovato un modo semplice che ha funzionato davvero e spero possa aiutare qualcun altro.

Vai al Pannello di controllo Vai a Strumenti di amministrazione Vai a Servizi Cerca nell'elenco per Machine Debug Manager Fare clic con il pulsante destro del mouse su di esso e fare clic su Proprietà. Nella scheda Generale, cercare Tipo di avvio Fare clic su Disabilita. Fare clic su Applica e OK.

Da allora non ho più visto il messaggio del debugger e il mio computer funziona perfettamente.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.