Question

Quand une application se bloque sous Windows et un débogueur tel que Visual Studio est installé la boîte de dialogue modale suivante apparaît:

  

[Titre: Microsoft Windows]

     

X a cessé de travailler

     

Un problème a provoqué l'arrêt du programme   fonctionne correctement. Windows fermer   le programme et vous informer si un   solution est disponible.

     

[Debug] [Fermer l'application]

Yat-il un moyen de désactiver cette boîte de dialogue? Cela est, que le programme juste crash and burn en silence?

Mon scénario est que je voudrais exécuter plusieurs tests automatisés, dont certains se bloque à cause de bogues dans l'application en cours de test. Je ne veux pas que ces boîtes de dialogue décrochant la course d'automatisation.

Recherche autour Je pense avoir localisé la solution pour désactiver ce sous Windows XP, qui est nuking cette clé reg:

  

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

Toutefois, cela ne fonctionne pas sous Windows Vista.

Était-ce utile?

La solution

Pour forcer Windows Error Reporting (REH) pour prendre un vidage sur incident et fermer l'application, au lieu de vous inviter à 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

Après ce paramètre est réglé, lors de crash de votre apps, vous devriez voir les fichiers * et * .hdmp .mdmp dans:

%ALLUSERSPROFILE%\Microsoft\Windows\WER\

Autres conseils

Voir ici:

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

regedit

DWORD HKLM ou HKCU \ Software \ Microsoft Erreur \ Windows \ Windows rapports \ DontShowUI = "1"

fera rapport REH en silence. Vous pouvez ensuite définir

DWORD HKLM ou HKCU \ Software \ Microsoft \ Windows \ Windows Error Reporting \ Désactivé = "1"

pour l'empêcher de parler à MS.

Je ne sais pas si cela fait référence à exactement la même boîte de dialogue, mais ici est une approche alternative Raymond Chen :

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

Je devais désactiver cette version pour le travail d'automatisation sur Windows 64 bits pour Firefox et je l'ai fait ce qui suit:

  • gpedit.msc
  • Configuration de l'ordinateur -> Modèles d'administration
  • Composants Windows -> Windows Error Reporting
  • Set « empêcher l'affichage de l'interface utilisateur pour les erreurs critiques » à Activé

Il est similaire ce qui a été accompli pour l'expérience client en rapport: http: / /www.blogsdna.com/2137/fix-windows-installer-explorer-update-has-stopped-working-in-windows-7.htm

Dans mon contexte, je veux seulement supprimer le menu contextuel pour mes tests unitaires et non pas pour l'ensemble du système. J'ai trouvé qu'une combinaison de fonctions sont nécessaires afin de supprimer ces erreurs, telles que la capture des exceptions non gérées, la suppression des contrôles de temps d'exécution (tels que la validité du pointeur de pile) et les indicateurs de mode d'erreur. Voilà ce que je l'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;
}

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

Vous devez mettre en place un filtre d'exception non gérée qui quitte simplement votre application, puis définissez cette fonction de filtre avec SetUnhandledExceptionFilter () .

Si vous utilisez le CRT sécurisé, vous devez également fournir votre propre gestionnaire de paramètres non valide et fixer cette valeur à _ set_invalid_parameter_handler ().

Ce blog a aussi quelques informations: http://blog.kalmbachnet.de/?postid=75

vous pouvez exécuter Au cours de test avec un 'debugger' comme ADPlus attaché qui peut être configuré de plusieurs manières utiles pour recueillir des données (minidumps) sur les erreurs et éviter encore les problèmes de dialogue modales vous énoncez ci-dessus.

Si vous souhaitez obtenir des informations utiles lorsque votre application se bloque dans la production que vous pouvez configurer

Ce n'est pas une réponse directe à la question puisque c'est 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 ne peut pas désactiver la fonction en utilisant l'une des autres réponses. Donc, je besoin d'une solution de contournement. Cela fonctionnera probablement pour au moins quelques autres qui finissent sur cette question.

autohotkey portable et créé une macro qui vérifie une fois par minute pour voir si la boîte popup existe, et si elle le fait, clique sur le bouton pour fermer le programme. Dans mon cas, c'est suffisant, et laisse la fonction sur les autres utilisateurs. Il faut que je lance le script lorsque je lance le programme à risque, mais il 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
}

modifier Un drapeau rapide. Quand d'autres choses sont en place, cela semble tenter d'activer les commandes dans la fenêtre de premier plan - il est censé envoyer au programme en arrière-plan. Si je trouve une solution, je vais modifier cette réponse pour réfléchir, mais pour l'instant, soyez prudent sur l'utilisation de cela et essayer de faire d'autres travaux sur une machine en même temps.

Après avoir essayé tout le reste sur l'Internet pour se débarrasser d'un peu de temps dans le débogueur, j'ai trouvé un moyen simple qui fonctionnait vraiment et je l'espère aider quelqu'un d'autre.

Accédez au Panneau de configuration Allez sur Outils d'administration Aller aux services Regardez la liste pour Machine Debug Manager Faites un clic droit dessus et cliquez sur Propriétés Sous l'onglet Général, recherchez Type de démarrage Up Cliquez sur Désactiver. Cliquez sur Appliquer et OK.

Je ne l'ai pas vu le message de débogage depuis, et mon ordinateur fonctionne parfaitement.

Au lieu de changer les valeurs dans le Registre, vous pouvez désactiver l'enregistrement completly d'erreur sur Windows Server 2008 R2, Windows Server 2012 et Windows 8 avec: serverWerOptin /disable

https://technet.microsoft. com / fr-fr / bibliothèque / hh875648 (v = ws.11) .aspx

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top