.net StackFrame.GetFileColumnNumber() 或 GetFileLineNumber() 不返回准确的信息



似乎GetFileColumnNumber()和GetFileLineNumber()作为StackFrame的成员实际上并没有给您函数调用的行/列,而是前一个冒号后行的第一个字符。例如,如果您的代码看起来像

class A {
    A foo() {
        StackTrace stackTrace = new StackTrace(true);
        StackFrame[] stackFrames = stackTrace.GetFrames();
        Console.WriteLine( stackFrames[1].GetFileLineNumber()+":"+
                           stackFrames[1].GetFileColumnNumber());
        return this;
    }
}
A a = new a();
a.foo().  // assume this is line 10, column 4
  foo().
  foo();

我希望输出是这样的,这是每次调用

ffoo中的位置
10:6
11:6
12:6

但结果是

10:4
10:4
10:4

表示第一个a的位置。这与断点的位置是一致的——如果你试图在第二个或第三个foo上放置一个断点,它会出现在第一个foo上。

关于如何获得准确的行/列信息的任何想法?我写了一些自我修改的代码,我需要找到正确的文件位置。我一直忽略列号(这是错误的),但依靠行号是准确的。如果您使用分号,例如

,它可以工作。
a.foo();
b.foo();
c.foo();

ILoffset在每次调用foo时都会改变…我想知道是否有另一种方法来映射IL偏移到源代码?

我相信这个位置是在报表级别记录的。

在第一个例子中,

a.foo().foo().foo(); 

是语句,而在第二个示例中,您有三个独立的语句。

相关内容

  • 没有找到相关文章

最新更新