web-dev-qa-db-fra.com

Comment imprimer la trace de pile actuelle dans .NET sans aucune exception?

J'ai un code C # régulier. Je n'ai aucune exception . Je souhaite consigner par programme la trace de pile actuelle à des fins de débogage. Exemple:

public void executeMethod() 
{
    logStackTrace();
    method();
}
315
Ricibald

Jetez un coup d'œil à l'espace de noms System.Diagnostics . Beaucoup de friandises là-dedans!

_System.Diagnostics.StackTrace t = new System.Diagnostics.StackTrace();
_

C’est vraiment bien de se renseigner pour savoir ce qui se passe sous le capot.

Je vous recommande de jeter un coup d'œil aux solutions de journalisation (telles que NLog, log4net ou les modèles et pratiques de Microsoft Enterprise Library) qui peuvent vous aider à atteindre vos objectifs. Bonne chance mec!

360
Spence

Une alternative à System.Diagnostics.StackTrace consiste à utiliser System.Environment.StackTrace , qui renvoie une représentation sous forme de chaîne de la pile.

Une autre option utile consiste à utiliser $CALLER et $CALLSTACKvariables de débogage dans Visual Studio car cela peut être activé au moment de l'exécution sans reconstruire l'application.

198
larsmoa

Il y a deux façons de faire ça. La System.Diagnostics.StackTrace() vous donnera une trace de pile pour le thread actuel. Si vous avez une référence à une instance Thread, vous pouvez obtenir le suivi de la pile via la version surchargée de StackTrace().

Vous pouvez également vouloir consulter la question de débordement de pile Comment obtenir le stacktrace d'un thread non courant?.

38
Brian Rasmussen

Vous pouvez également le faire dans le débogueur Visual Studio sans modifier le code.

  1. Créez un point d'arrêt où vous souhaitez voir la trace de la pile.
  2. Cliquez avec le bouton droit sur le point d'arrêt et sélectionnez "Actions ..." dans VS2015. Dans VS2010, sélectionnez "When Hit ...", puis activez "Imprimer un message".
  3. Assurez-vous que "Continuer l'exécution" est sélectionné.
  4. Tapez du texte que vous souhaitez imprimer.
  5. Ajoutez $ CALLSTACK où vous voulez voir la trace de la pile.
  6. Exécutez le programme dans le débogueur.

Bien sûr, cela n’aide en rien si vous exécutez le code sur une autre machine, mais il peut être très pratique de pouvoir cracher automatiquement une trace de pile sans affecter le code de version ni même avoir besoin de redémarrer le programme.

15
Hank Schultz
Console.WriteLine(
    new System.Diagnostics.StackTrace().ToString()
    );

La sortie sera similaire à:

at YourNamespace.Program.executeMethod (String msg)

at YourNamespace.Program.Main (String [] args)

Remplacez Console.WriteLine par votre méthode Log. En fait, .ToString() n'est pas nécessaire pour le cas Console.WriteLine car il accepte object. Mais vous en aurez peut-être besoin pour votre méthode Log (string msg).

3
epox