[C#.NET] 追蹤類別–StackTrace

  • 18679
  • 0
  • C#
  • 2013-07-05

[C#.NET] 追蹤類別–StackTrace

有時我們想要程式裡記錄log,比如記錄目前程式的行號,記錄方法是被哪個方法呼叫,我們可以使用 StackTrace類別 + StackFrame 類別 + MethodBase 類別 來達到我們的需求。這需要兩個命名空間:
System.Diagnostics
System.Reflection


範例如下:

private void Form1_Load(object sender, EventArgs e)
{
    TestMethod();
}

void TestMethod()
{
    string currentName = new StackTrace(true).GetFrame(0).GetMethod().Name;
    string callName = new StackTrace(true).GetFrame(1).GetMethod().Name;
    Trace.WriteLine("目前行號: " + new StackTrace(true).GetFrame(0).GetFileLineNumber().ToString());
    Trace.WriteLine("呼叫名稱: " + callName);
    Trace.WriteLine("目前方法: " + currentName);
    CallMethod();
}

image

  1. GetFrame(0)是指目前方法的堆疊。
  2. GetFrame(1)是指目前方法的上一層堆疊。
  3. 以此類推,看自己需要追蹤到什麼。

我為了精準的記錄目前的行號,我用了

Trace.WriteLine("目前行號: " + new StackTrace(true).GetFrame(0).GetFileLineNumber().ToString());

因為堆疊記錄在實體化的那一刻就已經建立了,觀察以下,我們可以看到第33行所記錄的行號是StackTrace實體化的那一刻的行號30,第34行所記錄的行號方式就是我要的,所以在使用上必須要注意一下。
image

 

StackTrace也可以觀察Exception

image

若有謬誤,煩請告知,新手發帖請多包涵


Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET

Image result for microsoft+mvp+logo