C# - デバッグ - スタックトレース


クラウディア 


1. 概要
2. 記述
3. 備考

1. 概要

 デバッグ出力時に、その箇所が誰から呼ばれたものかは、重要です。  それを出力するのは、「StackTrace」になります。

2. 記述

 ここでは、ログ出力の箇所を単に「Console.WriteLine()」で記述していますので、ご注意。  全部出力するのであれば。

using System.Diagnostics;

StackTrace stackTrace  = new StackTrace();
StackTrace stackTrace1 = new StackTrace(new StackFrame(true));
Console.WriteLine(" Stack trace for Main: " + stackTrace.ToString());
Console.WriteLine(stackTrace1.ToString());
 まぁ、これは、ネストが深いと、何行出力されるやら、なにがなにやら・・・てな感じになることが多いです。  上より、行が長くなりますが、こういう書き方もできます。

StackTrace stackTrace = new StackTrace(true);

for (int i=0; i<stackTrace.FrameCount; i++)
{
    StackFrame stackFrame = stackTrace.GetFrame(i);
    Console.WriteLine(stackFrame.GetMethod() +" "+ stackFrame.GetFileLineNumber());
}
 後ろに行番号をいれていますが、最適化されているのか?  0 で出力されることが多いです。  「GetFrame()」内の番号が、小さいほど、自分に近いことになるようです。  全部出すとわけわかんなくなるので、「for」のカウンタ最大値を小さめにしておけば、呼び出しに近い何個かを出力することができます。

3. 備考

 本ページは、下記のサイトを参考にさせていただきました。
StackTrace クラス (System.Diagnostics)