C# 以编程方式转储调用堆栈
正在寻找一种方法,以编程方式在遇到某段代码时转储调用堆栈和.net Win Forms应用程序。这是我以前没有遇到过的,但可以节省一些调试时间 更新:忘记添加,这会给应用程序增加多少开销,即它会大大降低应用程序的速度C# 以编程方式转储调用堆栈,c#,.net,debugging,C#,.net,Debugging,正在寻找一种方法,以编程方式在遇到某段代码时转储调用堆栈和.net Win Forms应用程序。这是我以前没有遇到过的,但可以节省一些调试时间 更新:忘记添加,这会给应用程序增加多少开销,即它会大大降低应用程序的速度 System.Environment.StackTrace 将以字符串形式提供当前堆栈 如果您有更高级的需求,也可以像其他人指出的那样使用StackTrace类。您可以使用: StackTrace callStack = new StackTrace(); StackTrace
System.Environment.StackTrace
将以字符串形式提供当前堆栈
如果您有更高级的需求,也可以像其他人指出的那样使用StackTrace
类。您可以使用:
StackTrace callStack = new StackTrace();
StackTrace callStack=newstacktrace()代码>
然后访问特定的堆栈帧:StackFrame=callStack.GetFrame(1)代码>
StackFrame frame = callStack.GetFrame(1);
从MSDN:
using System.Diagnostics;
StackTrace st = new StackTrace(true);
for(int i =0; i< st.FrameCount; i++ )
{
// Note that high up the call stack, there is only
// one stack frame.
StackFrame sf = st.GetFrame(i);
Console.WriteLine();
Console.WriteLine("High up the call stack, Method: {0}",
sf.GetMethod());
Console.WriteLine("High up the call stack, Line Number: {0}",
sf.GetFileLineNumber());
}
使用系统诊断;
StackTrace st=新的StackTrace(真);
对于(int i=0;i
实际上,它不会降低应用程序的速度,因为调用堆栈信息不能生成,它在代码的整个处理过程中都存在。-1:生成调用堆栈的信息存在,但肯定不是以最佳形式存储的。需要访问方法和类型名称(而不仅仅是它们的标记),必须将本机代码中的偏移量映射到字节码中的偏移量,然后将字节码中的偏移量映射到文件中的位置。总的来说,这是一个非常昂贵的操作,我相信这是异常处理中涉及的最昂贵的操作(最后一部分不是100%确定)。我不同意。最昂贵的操作是递归到调用堆栈的深度。如果分析调用堆栈上的第一级(1.call帧)或区域深度已达到20,则开销会有所不同。另请参阅关于开销/性能的内容,请参阅