【问题标题】:Get previous line number in stacktrace获取堆栈跟踪中的上一个行号
【发布时间】:2013-11-16 22:26:47
【问题描述】:

我正在执行一个名为 MethodA 的方法,在该方法中,我想获取 MethodA 的行号。我可以通过

得到这个号码

var lineNumber = stacktrace.GetFrame(i).GetFileLineNumber()

但是,这仅获取将在 MethodA 之后执行的下一行的行号。当我在 MethodA 和下一行代码之间有很大的空间时,这是有问题的。

有没有办法在stacktrace中获取当前行的上一行?

编辑: MethodA 在第 100 行的另一个文件中被 this 调用

MethodA();

我想找到第 100 行

编辑:

这个错误在发布模式下出现,但在调试模式下没问题

编辑:

所以我发现当取消选中构建选项中的优化代码时,我得到了正确的行号。但是,这仅在我在发布模式下调试时才有效;当我刚刚在发布模式下运行时,我得到了错误的行号。

【问题讨论】:

  • 你想完成什么?
  • 我猜没有办法,但我不确定。
  • 当您说“MethodA”时,您是指调用 MethodA 的位置、MethodA 方法实现的开始,还是 MethodA 实现中的某个特定行?从你的问题看不清楚。一个简单的代码示例会有所帮助。
  • 这是方法调用工作方式不可避免的副作用。堆栈上的地址是 return 地址,调用完成后代码应该在该地址恢复。这是 CALL 之后的机器代码指令。如果该地址是源代码中下一条语句生成的代码的开头,则报告的行号将减一。没有简单的解决方法。

标签: c# stack-trace


【解决方案1】:

上一行是堆栈中的下一帧。堆栈的顶部是当前行,下一行是前一个调用者(这是您想要的那个)。一个简单的循环应该可以获取您需要的信息:

    static void Main(string[] args)
    {
        

        MethodA();//called from line 26 on my code

        

        Console.ReadLine();
    }

    private static void MethodA()
    {
        var stacktrace = new StackTrace(true);//be sure to pass true to obtain line info


        for (int i = 0; i < stacktrace.FrameCount; i++)
        {
            var frame = stacktrace.GetFrame(i);

            Console.WriteLine("{0}, {1}, {2}, {3}", frame.GetFileLineNumber(), frame.GetMethod(), frame.GetFileName(), frame.GetFileColumnNumber());
       
        }
    }

输出:

35, 无效方法A(), c:\Development\General\Samples\WindowsFormsApplication1\Cons oleApplication1\Program.cs, 13

26, 无效的 Main(System.String[]), c:\Development\General\Samples\WindowsFormsAppli 阳离子1\ConsoleApplication1\Program.cs,13

注意这里调用者在线26

【讨论】:

  • 我有相同的代码,但我 GetFileLineNumber 为我获取下一行
  • @user2932876 - 奇怪。您是否在此处复制粘贴示例?好吧,在黑暗中拍摄...您是在调试模式下运行还是在发布模式下运行?如果调试,也许尝试编译为 x86 而不是任何 CPU。
  • 哦,是的,它在调试模式下工作,但我需要它在发布 mdoe 中
  • @user2932876 - 信息应该来自 *.pdb 文件。所以我的猜测是不知何故没有生成 pdb 文件。从 VS 2005 开始,它们应该默认使用发布模式生成。你在运行什么版本的 VS?
  • 我在跑2012,同事让我在release模式下开启pdb生成,现在试试
猜你喜欢
  • 2018-08-10
  • 2012-12-12
  • 1970-01-01
  • 2010-11-21
  • 2010-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多