【问题标题】:Dumping the call stack programmatically以编程方式转储调用堆栈
【发布时间】:2010-12-13 07:46:09
【问题描述】:

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

更新:忘了补充,这会给应用程序增加多少开销,即它会大大减慢速度。

【问题讨论】:

标签: c# .net debugging


【解决方案1】:
System.Environment.StackTrace

会给你当前的堆栈作为一个字符串。

如果您有更高级的需求,您也可以使用其他人指出的 StackTrace 类。

【讨论】:

    【解决方案2】:

    您可以使用:

    StackTrace callStack = new StackTrace();

    然后访问特定的堆栈帧:

    StackFrame frame = callStack.GetFrame(1);

    【讨论】:

      【解决方案3】:

      http://msdn.microsoft.com/en-us/library/system.diagnostics.stacktrace.aspx

      来自 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());
              }
      

      【讨论】:

        【解决方案4】:

        实际上它不会减慢您的应用程序,因为调用堆栈信息不一定会生成,它存在于您的代码的整个处理过程中。

        【讨论】:

        • -1:生成调用堆栈的信息存在,但绝对不是以最佳形式存储的。方法和类型 names 需要被访问(而不仅仅是它们的标记),本机代码中的偏移量必须映射到字节码中的偏移量,然后映射到文件中的位置。总的来说,这是一个非常昂贵的操作,我相信它是异常处理中最昂贵的操作(最后一部分不是 100% 确定)。
        • 我不同意。最昂贵的操作是递归到调用堆栈的深度。如果您分析调用堆栈的第一级(1. 调用框架)或者如果您的区域已经在 20 的深度,则开销是不同的。
        猜你喜欢
        • 2012-10-09
        • 2020-07-16
        • 2021-07-13
        • 2010-09-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-12
        相关资源
        最近更新 更多