[C#] 在 C# 中获取函数的调用栈数据(方便日志打印(获取文件名、行号、函数名))
在 C# 中获取当前函数的调用栈帧信息需要用到一个叫 StackTrace 的类和一个叫 StackFrame。前者记录了当前调用栈跟踪数据,后者表示一个栈帧。
简单地说,假设有A->B->C
的调用链,其表示 A 调用 B,B 调用 C。那么 A、B、C 三者这一层调用关系链即叫作栈跟踪(StackTrace),而它们其中之一则叫作一个栈帧(StackFrame)。
以下的代码简单地介绍了如何在 C# 中使用这两个类来获取当前的函数调用信息:
using System;
using System.Diagnostics;
namespace TestStackTrace
{
class Program
{
public static void TraceStack()
{
// 0 表示要忽略的帧数
// true 表示需要文件信息
var stack = new StackTrace(0, true);
for (int i = 0; i < stack.FrameCount; i++) {
var frame = stack.GetFrame(i);
var trace = ""
+ "文件:" + frame.GetFileName()
+ "\n函数:" + frame.GetMethod().Name
+ "\n行号:" + frame.GetFileLineNumber()
+ "\n"
;
Console.WriteLine(trace);
}
}
public void MyMethod()
{
TraceStack();
}
static void Main(string[] args)
{
var program = new Program();
program.MyMethod();
}
}
}
以下是示例输出:
文件:c:\Users\admin\Desktop\StackTrace\Program.cs
函数:TraceStack
行号:10
文件:c:\Users\admin\Desktop\StackTrace\Program.cs
函数:MyMethod
行号:26
文件:c:\Users\admin\Desktop\StackTrace\Program.cs
函数:Main
行号:32
-----------------------------------------------------------
文件:c:\Users\admin\Desktop\StackTrace\Program.cs
函数:TraceStack
行号:14
文件:c:\Users\admin\Desktop\StackTrace\Program.cs
函数:Main
行号:35
-----------------------------------------------------------
文件:
函数:TraceStack
行号:0
文件:
函数:Main
行号:0
一共3部分。第1部分是 Debug 版本的输出;第2部分是 Release(带PDB) 版本的输出;第3部分是 Release(不带PDB) 版本的输出。