9

わかった; このコードがデバッグモードで実行されていると仮定して -

static StackFrame GetTopFrameWithLineNumber(Exception e)
{
    StackTrace trace = new StackTrace(e);
    foreach (StackFrame frame in trace.GetFrames())
    {
        if (frame.GetFileLineNumber() != 0)
        {
            return frame;
        }
    }
    return null;
}

私は常にnullを返しています。Exception.StackTrace文字列を調べると、フレームワーク以外のコードには明らかに行番号があるのに、スタック フレームに行番号がないのはなぜですか? 私が認識していない例外からスタック トレースを作成する際に問題はありますか?

わかりやすくするために編集: スローされた例外で、StackTrace プロパティの行番号を確認できます。それは、必要なものがすべて揃っていることを意味すると思います。

4

1 に答える 1

17

例外を受け取る StackTrace コンストラクターのオーバーロードに関するドキュメントによると、そのように StackTrace を作成するときに行番号を期待することはできません。

StackTrace は呼び出し元の現在のスレッドで作成され、ファイル名、行番号、または列情報は含まれません。

行番号を取得するには、bool と例外を受け取るオーバーロードを使用する必要があります。

行番号用のシンボル ファイル (pdb) も必要です。シンボル ファイルは、デバッグ ビルドとリリース ビルドの両方で使用できます。

于 2010-02-09T12:20:26.317 に答える