Domanda

Quando un'applicazione si blocca su Windows e un debugger come Visual Studio è installato il seguente finestra di dialogo modale appare:

  

[Titolo: Microsoft Windows]

     

X ha smesso di funzionare

     

Un problema causato il programma di smettere   funziona correttamente. Verrà chiuso   il programma e notificare se un   soluzione è disponibile.

     

[Debug] [Chiudi applicazione]

C'è un modo per disattivare questa finestra di dialogo? Cioè, hanno il programma appena crash e bruciare in silenzio?

Il mio scenario è che vorrei eseguire diversi test automatizzati, alcuni dei quali in crash a causa di bug nell'applicazione in prova. Non voglio queste finestre di dialogo in stallo la corsa di automazione.

Cercando in giro credo di aver localizzato la soluzione per la disattivazione di questa su Windows XP, che nuke questa chiave del registro:

  

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

Tuttavia, che non ha funzionato su Windows Vista.

È stato utile?

Soluzione

Per forzare di Windows Error Reporting (WER) per prendere un crash dump e chiudere l'applicazione, invece di che richiede di eseguire il debug del programma, è possibile impostare queste voci del 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 questo è impostato, quando il crollo applicazioni, si dovrebbe vedere i file * .hdmp e * .mdmp in:

%ALLUSERSPROFILE%\Microsoft\Windows\WER\

Altri suggerimenti

Vedi qui:

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

regedit

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

farà rapporto WER in silenzio. Quindi è possibile impostare

DWORD HKLM o HKCU \ Software \ errori Microsoft \ Windows \ Windows Reporting \ Disabilitato = "1"

per impedire che parlando con MS.

Non sono sicuro se questo si riferisce al esattamente la stessa finestra di dialogo, ma qui è un approccio alternativo da Raymond Chen :

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

ho dovuto disattivare questo per il lavoro di automazione di rilascio su Windows a 64-bit per Firefox e ho fatto la seguente:

  • gpedit.msc
  • Configurazione computer -> Modelli amministrativi
  • Componenti di Windows -> Segnalazione errori Windows
  • Set "visualizzazione Prevenire dell'interfaccia utente per gli errori critici" a Enabled

E 'simile ciò che è stato compiuto per la segnalazione 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 per sopprimere la comparsa per mio test di unità e non per l'intero sistema. Ho scoperto che una combinazione di funzioni sono necessari al fine di sopprimere questi errori, come ad esempio la cattura di eccezioni non gestite, sopprimendo i controlli di run time (come ad esempio la validità della stack pointer) e le bandiere della modalità 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;
}

In 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 di eccezione non gestita che si chiude semplicemente la vostra applicazione, quindi impostare tale funzione di filtro con SetUnhandledExceptionFilter () .

Se si utilizza il CRT sicuro, si hanno anche per fornire il proprio gestore di parametro non valido e impostare questo con _ set_invalid_parameter_handler ().

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

Durante il test è possibile eseguire con un 'debugger' come ADPlus allegato che può essere configurato in molti modi utili per raccogliere dati (minidumps) su errori e tuttavia evitare che i problemi di dialogo modale si stato al di sopra.

Se si desidera ottenere alcune informazioni utili quando si blocca l'app in produzione è possibile configurare segnalazione errori Microsoft per ottenere qualcosa di simile ai dati ADPlus.

Questa non è una risposta diretta alla domanda dal momento che questo è una soluzione e la questione è su come disattivare questa funzionalità, ma nel mio caso, io sono un utente su un server con autorizzazioni limitate e non può disattivare la funzione utilizzando una delle altre risposte. Così, ho bisogno di una soluzione alternativa. Questo probabilmente lavorare per almeno alcuni altri che finiscono su questa questione.

autohotkey portatile e ha creato una macro che una volta al minuto controlla se esiste la casella pop-up, e se lo fa, fa clic sul pulsante per chiudere il programma. Nel mio caso, questo è sufficiente, e lascia la caratteristica su per gli altri utenti. Richiede che mi metto il copione quando ho eseguito 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 rapido. Quando le altre cose sono in su, questo sembra tentare di attivare i comandi nella finestra in primo piano - si suppone di inviarlo al programma in background. Se trovo una correzione, Io modificare questa risposta per riflettere, ma per il momento, essere cauti sull'utilizzo di questo e cercando di fare altri lavori su una macchina allo stesso tempo.

Dopo aver provato tutto il resto su internet per sbarazzarsi di appena in tempo debugger, ho trovato un modo semplice che in realtà ha funzionato e spero possa aiutare qualcun altro.

Vai al Pannello di controllo Vai a Strumenti di amministrazione Vai a Servizi Guardate in basso la lista per Machine Debug Manager Fare clic destro su di esso e fare clic su Proprietà Nella scheda Generale, cercare Start Up Tipo Clicca su Disattiva. Fare clic su Applica e OK.

Non ho visto il messaggio debugger da allora, e il mio computer è in esecuzione perfettamente.

Invece di cambiare i valori nel Registro di sistema si può completamente disabilitare la segnalazione degli errori in Windows Server 2008 R2, Windows Server 2012 e Windows 8 con: serverWerOptin /disable

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top