Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 以编程方式转储调用堆栈_C#_.net_Debugging - Fatal编程技术网

C# 以编程方式转储调用堆栈

C# 以编程方式转储调用堆栈,c#,.net,debugging,C#,.net,Debugging,正在寻找一种方法,以编程方式在遇到某段代码时转储调用堆栈和.net Win Forms应用程序。这是我以前没有遇到过的,但可以节省一些调试时间 更新:忘记添加,这会给应用程序增加多少开销,即它会大大降低应用程序的速度 System.Environment.StackTrace 将以字符串形式提供当前堆栈 如果您有更高级的需求,也可以像其他人指出的那样使用StackTrace类。您可以使用: StackTrace callStack = new StackTrace(); StackTrace

正在寻找一种方法,以编程方式在遇到某段代码时转储调用堆栈和.net Win Forms应用程序。这是我以前没有遇到过的,但可以节省一些调试时间

更新:忘记添加,这会给应用程序增加多少开销,即它会大大降低应用程序的速度

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,则开销会有所不同。另请参阅关于开销/性能的内容,请参阅