1

我正在执行一个名为 MethodA 的方法,在该方法中,我想获取 MethodA 的行号。我可以得到这个号码

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

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

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

编辑:方法A在第100行的另一个文件中被调用

MethodA();

我想找到第 100 行

编辑:

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

编辑:

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

4

1 回答 1

2

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

    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 cation1\ConsoleApplication1\Program.cs, 13

注意这里调用者在第26行

于 2013-11-05T21:49:24.277 回答