Come disabilitare la finestra di dialogo “Debug / Close Application” su Windows Vista?

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 causato il blocco del programma in modo corretto. Windows chiuderà il programma e ti informsrà se una soluzione è disponibile.

[Debug] [Chiudi applicazione]

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

Il mio scenario è che mi piacerebbe eseguire diversi test automatici, alcuni dei quali si bloccheranno a causa di bug nell’applicazione in prova. Non voglio che queste windows di dialogo bloccino l’esecuzione dell’automazione.

Cercando in giro penso di aver trovato la soluzione per disabilitare questo in Windows XP, che sta facendo il nuking su questa chiave di reg:

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

Tuttavia, questo non ha funzionato su Windows Vista.

Per forzare Windows Error Reporting (WER) a fare un crash dump e chiudere l’app, invece di richiedere 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 averlo impostato, quando le app si bloccano, dovresti vedere i file * .hdmp e * .mdmp in:

 %ALLUSERSPROFILE%\Microsoft\Windows\WER\ 

Vedere qui:

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

regedit

Segnalazione errori DWORD HKLM o HKCU \ Software \ Microsoft \ Windows \ Windows \ DontShowUI = “1”

farà in modo che il WER riferisca silenziosamente. Quindi puoi impostare

Segnalazione errori DWORD HKLM o HKCU \ Software \ Microsoft \ Windows \ Windows \ Disabilitato = “1”

per impedirgli di parlare con la SM.

Non sono sicuro che questo si riferisca esattamente allo stesso dialogo, ma qui c’è un approccio alternativo da Raymond Chen :

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

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

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

È simile a ciò che è stato ottenuto per la segnalazione di Customer Experience in: http://www.blogsdna.com/2137/fix-windows-installer-explorer-update-has-stopped-working-in-windows-7.htm

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

 #include  #include  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; } 

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

È necessario implementare un filtro delle eccezioni non gestito che si chiude semplicemente dall’applicazione, quindi impostare la funzione filtro con SetUnhandledExceptionFilter () .

Se stai utilizzando il CRT sicuro, devi anche fornire il tuo gestore parametri non valido e impostarlo con _set_invalid_parameter_handler ().

Questo post del blog ha anche alcune informazioni: http://blog.kalmbachnet.de/?postid=75

Durante il test è ansible eseguire un “debugger” come ADPlus collegato che può essere configurato in molti modi utili per raccogliere i dati (minidump) sugli errori e, tuttavia, impedire i problemi di dialogo modale indicati in precedenza.

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

Questa non è una risposta diretta alla domanda poiché questa è una soluzione alternativa e la domanda è su 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 di l’altro risponde. Quindi, avevo bisogno di una soluzione. Questo probabilmente funzionerà per almeno alcuni altri che finiscono con questa domanda.

Ho usato autohotkey portable e ho creato una macro che una volta al minuto controlla se la casella popup esiste e, in caso affermativo , fa clic sul pulsante per chiudere il programma. Nel mio caso, è sufficiente e lascia la funzionalità per altri utenti. Richiede che avvii lo script quando eseguo il programma a rischio, ma funziona per i miei bisogni.

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 rapida. Quando ci sono altre cose, sembra che questo tenti di triggersre i controlli nella finestra in primo piano – dovrebbe inviarlo al programma in background. Se trovo una correzione, modificheremo questa risposta per rifletterla, ma per ora, sii cauto nell’usare questo e provare a fare altro lavoro su una macchina allo stesso tempo.

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

Vai a Pannello di controllo Vai a Strumenti di amministrazione Vai a Servizi Guarda l’elenco di Machine Debug Manager Fare clic destro su di esso e fare clic su Proprietà Sotto la scheda Generale, cercare il tipo di avvio Fare clic su Disabilita. Fare clic su Applica e OK.

Da allora non vedo il messaggio del debugger e il mio computer funziona perfettamente.

Invece di modificare i valori nel registro, è ansible disabilitare completamente la segnalazione degli errori su Windows Server 2008 R2, Windows Server 2012 e Windows 8 con: serverWerOptin /disable

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