Comment désactiver la boîte de dialogue «Déboguer / Fermer l'application» sous Windows Vista?

86

Lorsqu'une application se bloque sous Windows et qu'un débogueur tel que Visual Studio est installé, la boîte de dialogue modale suivante s'affiche:

[Titre: Microsoft Windows]

X a cessé de fonctionner

Un problème a empêché le programme de fonctionner correctement. Windows fermera le programme et vous avertira si une solution est disponible.

[Déboguer] [Fermer l'application]

Existe-t-il un moyen de désactiver cette boîte de dialogue? Autrement dit, le programme se bloque-t-il et brûle-t-il en silence?

Mon scénario est que je voudrais exécuter plusieurs tests automatisés, dont certains planteront en raison de bogues dans l'application testée. Je ne veux pas que ces boîtes de dialogue bloquent l'exécution de l'automatisation.

En cherchant autour de moi, je pense avoir trouvé la solution pour désactiver cela sur Windows XP, qui détruit cette clé de registre:

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

Cependant, cela ne fonctionnait pas sous Windows Vista.

Chris Smith
la source
Nuking la clé AeDebug \ Debugger n'a eu aucun effet pour moi sous Windows XP, que ce soit sur les applications console compilées avec des bibliothèques de débogage ou non de débogage.
rptb1

Réponses:

56

Pour forcer Windows Error Reporting (WER) à effectuer un vidage sur incident et à fermer l'application, au lieu de vous demander de déboguer le programme, vous pouvez définir ces entrées de registre:

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

Une fois que cela est défini, lorsque vos applications se bloquent, vous devriez voir les fichiers * .hdmp et * .mdmp dans:

%ALLUSERSPROFILE%\Microsoft\Windows\WER\
NicJ
la source
3
DefaultConsent = 1 semble être la valeur par défaut. Et DontShowUI?
Zitrax
La documentation de ForceQueue est vague, je ne comprends pas exactement ce que cela signifie.
Zitrax
2
@NicJ s'il vous plaît ajouter DontShowUI = 1 à votre réponse, c'est l'essentiel
Youda008
1
Peut également être défini sous HKEY_CURRENT_USER, je crois
PJTraill
2
La modification du registre Windows est le chemin vers l'enfer informatique, mieux vaut considérer la réponse d'armenzg
lowtech
45

Vois ici:

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

regedit

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

fera rapport silencieusement WER. Ensuite, vous pouvez définir

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

pour l'empêcher de parler à MS.


la source
A travaillé pour moi dans la résolution d'un problème d'agent de construction VSTS où j'essayais d'exécuter des tests Selenium. Merci!
Stu1986C
36

Je ne sais pas si cela fait exactement référence au même dialogue, mais voici une approche alternative de Raymond Chen :

DWORD dwMode = SetErrorMode(SEM_NOGPFAULTERRORBOX);
SetErrorMode(dwMode | SEM_NOGPFAULTERRORBOX);
Luke Quinane
la source
Oui, appeler SetErrorMode comme ça empêche la boîte de dialogue WER mentionnée par l'OP.
Roman Starkov
2
Le problème que j'ai avec SetErrorMode et l'indicateur SEM_NOGPFAULTERRORBOX est qu'il ne crée pas de fichier de vidage et n'effectue pas d'entrée dans le journal des événements Windows. Votre programme disparaîtra simplement sans laisser de trace lorsqu'il se bloquera. Pour cette raison, je pense que la solution de registre est meilleure.
Derek
Cela fonctionne également pour les frameworks obsolètes (depuis WinXP).
Wolf
1
Convenu que ce n'est pas bon à expédier. Cependant, il est vraiment utile de débloquer des tâches d'automatisation instables.
kayleeFrye_onDeck
31

J'ai dû désactiver cela pour le travail d'automatisation des versions sur Windows 64 bits pour Firefox et j'ai fait ce qui suit:

  • gpedit.msc
  • Configuration de l'ordinateur -> Modèles d'administration
  • Composants Windows -> Rapport d'erreurs Windows
  • Définissez «Empêcher l'affichage de l'interface utilisateur pour les erreurs critiques» sur Activé

C'est similaire à ce qui a été accompli pour les rapports d'expérience client dans: http://www.blogsdna.com/2137/fix-windows-installer-explorer-update-has-stopped-working-in-windows-7.htm

armenzg
la source
13

Dans mon contexte, je souhaite uniquement supprimer le popup pour mes tests unitaires et non pour l'ensemble du système. J'ai trouvé qu'une combinaison de fonctions est nécessaire pour supprimer ces erreurs, telles que la capture d'exceptions non gérées, la suppression des vérifications d'exécution (telles que la validité du pointeur de pile) et les indicateurs de mode d'erreur. C'est ce que j'ai utilisé avec un certain succès:

#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
la source
8

Dans l'application 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 );
}
Francesco Germinara
la source
Il ne semble pas qu'il y ait quelque chose de spécifique à WPF là-dedans, et cela semble fonctionner très bien dans mon application console également (.NET 4.6.2 sous Windows 10)
mookid8000
4

Pendant le test, vous pouvez exécuter avec un `` débogueur '' comme ADPlus attaché qui peut être configuré de nombreuses manières utiles pour collecter des données (minidumps) sur les erreurs et éviter les problèmes de dialogue modal que vous indiquez ci-dessus.

Si vous souhaitez obtenir des informations utiles lorsque votre application plante en production, vous pouvez configurer le rapport d'erreurs Microsoft pour obtenir quelque chose de similaire aux données ADPlus.

Steve Steiner
la source
4

Ce n'est pas une réponse directe à la question car il s'agit d'une solution de contournement et la question est de savoir comment désactiver cette fonctionnalité, mais dans mon cas, je suis un utilisateur sur un serveur avec des autorisations limitées et je ne peux pas désactiver la fonctionnalité en utilisant l'un des les autres réponses. Donc, j'avais besoin d'une solution de contournement. Cela fonctionnera probablement pour au moins quelques autres qui se retrouveront sur cette question.

J'ai utilisé autohotkey portable et créé une macro qui vérifie une fois par minute si la boîte de dialogue existe et, si c'est le cas, clique sur le bouton pour fermer le programme. Dans mon cas, cela suffit et laisse la fonctionnalité activée pour les autres utilisateurs. Cela nécessite que je lance le script lorsque j'exécute le programme à risque, mais cela fonctionne pour mes besoins.

Le script est le suivant:

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: Un indicateur rapide. Lorsque d'autres choses se passent, cela semble tenter d'activer les contrôles dans la fenêtre de premier plan - il est censé les envoyer au programme en arrière-plan. Si je trouve un correctif, je modifierai cette réponse pour la refléter, mais pour l'instant, soyez prudent lorsque vous utilisez ceci et essayez de faire d'autres travaux sur une machine en même temps.

pseudo
la source
3

Après avoir essayé tout le reste sur Internet pour me débarrasser du débogueur juste à temps, j'ai trouvé un moyen simple qui fonctionnait réellement et j'espère aider quelqu'un d'autre.

Allez dans le panneau de configuration Allez dans les outils d'administration Allez dans les services Regardez la liste pour Machine Debug Manager Cliquez avec le bouton droit dessus et cliquez sur Propriétés Sous l'onglet Général, recherchez le type de démarrage Cliquez sur Désactiver. Cliquez sur Appliquer et OK.

Je n'ai pas vu le message du débogueur depuis, et mon ordinateur fonctionne parfaitement.

Vicki Mollenauer
la source