0

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();

出力がこれになることを望んでいました。これは、各呼び出しのfinの場所ですfoo

10:6
11:6
12:6

しかし、代わりに

10:4
10:4
10:4

これは最初の の場所ですa。これは、ブレークポイントの位置と一致しています。ブレークポイントを 2 番目または 3 番目の foo に配置しようとすると、最初の foo に表示されます。

正確な行/列情報を取得する方法について何か考えはありますか? 自己修正コードを書いたので、正しいファイル位置を見つける必要があります。私は列番号を無視してきました (これは間違っています) が、行番号が正確であることに依存しています。たとえば、セミコロンを使用すると機能します。

a.foo();
b.foo();
c.foo();

ILoffset は foo への呼び出しごとに変更されます... IL オフセットをソース コードにマップする別の方法があるのだろうか?

4

1 に答える 1