调试 Debug
StackTrace
可以使用StackTrace
类来获取当前的调用堆栈信息,所属的命名空间为System.Diagnostics
。
System.Diagnostics.StackTrace t = new System.Diagnostics.StackTrace();
StackTrace类的构造函数有两个重载,一个是不带参数的,一个是带参数的。不带参数的构造函数会获取当前的调用堆栈信息,而带参数的构造函数接受 Exception 类型,会获取 Exception 的调用堆栈信息。
如果想要获取调用方法的文件名和行号,需要在构造函数中传入true
,否则只能获取方法名。
签名如下:
public StackTrace (bool fNeedFileInfo);
注意 StackTrace 的执行代价很高,因为它需要获取当前的调用堆栈信息,会拖慢程序的执行速度,因此不要在生产环境中使用。
例子
不带参数:
void Main()
{
System.Diagnostics.StackTrace t = new StackTrace(true);
t.Dump(); // 获取此时的堆栈信息
}
带参数:
using System;
class Program {
static void Main(string[] args) {
try
{
Foo(); // 调用方法
}
catch (Exception ex)
{
Console.WriteLine("出现异常:{0}", ex.Message);
// 获取堆栈跟踪信息
StackTrace stackTrace = new StackTrace(ex, true);
Console.WriteLine("堆栈跟踪信息:");
for (int i = 0; i < stackTrace.FrameCount; i++)
{
Console.WriteLine("{0}.{1}({2})",
stackTrace.GetFrame(i).GetMethod().DeclaringType.FullName,
stackTrace.GetFrame(i).GetMethod().Name,
stackTrace.GetFrame(i).GetFileLineNumber());
}
}
}
static void Foo()
{
Bar(); // 调用方法
}
static void Bar()
{
throw new Exception("Bar 方法抛出的异常");
}
}
// Output:
// 出现异常:Bar 方法抛出的异常
// 堆栈跟踪信息:
// UserQuery+Program.Bar(33)
// UserQuery+Program.Foo(28)
// UserQuery+Program.Main(7)
ref
StackTrace Constructor (System.Diagnostics) | Microsoft Learn