web-dev-qa-db-fra.com

Le code source .NET peut-il coder en dur un point d'arrêt de débogage?

Je cherche un moyen dans .NET (2.0, C # en particulier) pour que le code source déclenche une interruption de débogage comme si un point d'arrêt était défini à ce point, sans avoir à se rappeler de définir un point d'arrêt spécifique dans le débogueur, et sans interférer avec l'exécution de la production.

Notre code doit avaler des exceptions en production afin de ne pas perturber une application cliente qui nous relie, mais j'essaie de le configurer de sorte que de telles erreurs apparaîtront pour être analysées s'il se trouve qu'elles s'exécutent dans un débogueur , sinon il sera ignoré en toute sécurité.

Ma tentative d'utiliser Debug.Assert(false) a été loin d'être idéale, et je suppose que Debug.Fail() se comporterait de la même manière. Il ne devrait théoriquement pas avoir d'effet sur la production, et il s'arrête avec succès lors du débogage, mais par conception, il n'y a (pour autant que je sache) aucun moyen de continuer l'exécution si vous voulez ignorer cette erreur, comme vous le pourriez avec un point d'arrêt réel , et comme ce serait le cas en production où l'on avale l'erreur. Il casse également apparemment l'évaluation de l'état des variables car le débogueur s'arrête réellement dans le code système natif et non dans le nôtre, donc l'aide au débogage est limitée. (Peut-être que je manque un moyen de revenir dans les choses pour regarder les variables et ainsi de suite où cela s'est produit. ???)

J'espérais quelque chose comme Debug.Break(), mais cela ne semble pas exister (sauf peut-être dans une version ultérieure de .NET?), Et aucune autre méthode Debug ne semble applicable non plus.

pdate: Alors que la réponse de ctacke correspond le mieux à ce que je cherchais, j'ai également découvert une astuce avec Debug.Assert () - lors de l'exécution dans le débogueur - Mettez le débogueur en pause, allez au code de l'appel Debug.Assert en attente (surligné en vert car il est en baisse dans le code du framework) et appuyez sur Step-Out (shift-F11), puis appuyez sur Ignorer dans la boîte de dialogue assert. Cela laissera le débogueur en pause lors du retour de l'assertion (et pourra continuer l'exécution comme si elle ne s'était pas produite, car elle a été ignorée). Il peut y avoir d'autres façons de faire la même chose (est-ce que frapper Retry le fait plus directement?), Mais cette façon était intuitive.

69
Rob Parker

Vous recherchez probablement quelque chose comme ceci:

if(System.Diagnostics.Debugger.IsAttached)
  System.Diagnostics.Debugger.Break();

Bien sûr, cela sera toujours compilé dans une version Release. Si vous voulez qu'il se comporte plus comme l'objet Debug où le code n'existe tout simplement pas dans une version Release, alors vous pouvez faire quelque chose comme ceci:

    // Conditional("Debug") means that calls to DebugBreak will only be
    // compiled when Debug is defined. DebugBreak will still be compiled
    // even in release mode, but the #if eliminates the code within it.
    // DebuggerHidden is so that, when the break happens, the call stack
    // is at the caller rather than inside of DebugBreak.
    [DebuggerHidden]
    [Conditional("DEBUG")] 
    void DebugBreak()
    {
        if(System.Diagnostics.Debugger.IsAttached)
            System.Diagnostics.Debugger.Break();
    }

Ajoutez-y ensuite un appel dans votre code.

127
ctacke

System.Diagnostics.Debugger.Break?

12
shahkalpesh

Si vous ne souhaitez avoir qu'une seule ligne de code au lieu de 4, encapsulez

#if DEBUG
       if (Debugger.IsAttached)
            Debugger.Break();
#endif

dans

public static class DebugHelper
{
    [DebuggerHidden]
    [Conditional("DEBUG")]
    public static void Stop()
    {
       if (Debugger.IsAttached)
            Debugger.Break();
    }
}

et utilise

DebugHelper.Stop();

DebuggerHiddenAttribute a été ajouté pour empêcher le débogueur de s'arrêter sur le code interne de la méthode Stop et d'entrer dans la méthode avec F11.

10
Sergey

J'ai rencontré une fois une situation où cela n'a pas fonctionné

System.Diagnostics.Debugger.Break();

mais cela a fait

System.Diagnostics.Debugger.Launch();
9
CheGueVerra

Que diriez-vous de simplement configurer Visual Studio pour qu'il apparaisse avec le débogueur même si vous l'avalez?

Faites ceci:

  • Allez dans Debug-> Exceptions ...
  • Trouvez la bonne exception ou ajoutez-la si c'est la vôtre
  • Cochez la case "Lancé" pour l'exception

Cela arrêtera Visual Studio à l'emplacement où l'exception est levée, pas seulement si elle n'est pas gérée.

Vous pouvez voir plus d'informations ici .

Une bonne astuce que j'ai trouvée consiste à mettre Debugger.Break () dans le ctor de votre exception.

4

Dans Visual Studio 2010, appuyez sur Réessayer sur un Debug.Assert la boîte de dialogue vous amène à l'assertion de débogage ayant échoué, comme si vous aviez un point d'arrêt.

1
Aren Cambre