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();
}
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!
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 $CALLSTACK
variables de débogage dans Visual Studio car cela peut être activé au moment de l'exécution sans reconstruire l'application.
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?.
Vous pouvez également le faire dans le débogueur Visual Studio sans modifier le code.
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.
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).