web-dev-qa-db-ja.com

.NETでスローされた例外のStackTraceの行番号を取得して表示する方法

MSDNはStackTraceクラスのExceptionプロパティについてこれを述べています:

StackTraceプロパティはスタックトレースを保持します。これを使用して、コード内のどこでエラーが発生したかを判断できます。 StackTraceは、例外の前に呼び出されたすべてのメソッドと、呼び出しが行われたソースの行番号をリストします。

だから私はこの情報が利用可能であることを知っています。スタックトレースに実際に表示される行番号を取得するにはどうすればよいですか?私のコードは、膨大な数のオブジェクトを通過する非常に困難で複雑なコードの一部で例外をスローしているので、例外が発生している場所を確認するために膨大な数のステップを実行する必要はありません。例外のスタックトレースには、メソッドシグネチャのみが表示され、行番号は表示されません。

33

StackTraceの行番号を取得するには、dll/exeとともに正しいデバッグ情報(PDBファイル)が必要です。デバッグ情報を生成するには、Project Properties -> Build -> Advanced -> Debug Info

alt text

それをfullに設定するだけで十分です(他のオプションの機能については [ビルドの詳細設定]ダイアログボックスのドキュメント を参照してください)。デバッグ情報(PDBファイルなど)は、デフォルトでデバッグビルド構成に対して生成されますが、リリースビルド構成に対しても生成できます。

リリースビルド用のPDBを生成すると、PDBなしでコードを出荷できますが、行番号が必要な場合は(またはリモートデバッガーを接続する場合も)、PDBをdllの横にドロップできます。注意すべき点の1つは、リリースビルドでは、コンパイラーまたはJITコンパイラーによって行われた最適化のために、行番号が完全に正しくない場合があることです(これは、行番号が0と表示される場合は特にそうです)。

41
adrianbanks

VS2012以降を使用するWebアプリケーションまたはWebサービスプロジェクトがある場合、ビルド設定の変更は機能しません。代わりに、この記事のアドバイスに従う必要があります。

Visual Studio 2012 Webサイト公開では.pdbファイルをコピーしない

具体的には、次の設定を

<YOUR_PROJECT>\Properties\PublishProfiles\*.pubxml

プロジェクトのファイル:

<PropertyGroup>
  <ExcludeGeneratedDebugSymbol>False</ExcludeGeneratedDebugSymbol>
</PropertyGroup>
6
Peter Gluck

Pdbファイルを有効にしてプロジェクトをビルドし、アプリケーションと一緒にpdbファイルをデプロイする必要があります。 pdbファイルが必要なアセンブリを右クリックし、[プロパティ]> [ビルド]> [詳細設定]に移動して、[出力デバッグ情報]が完全に設定されていることを確認することで、pdbファイルが実際に構築されているかどうかを確認できます。

6
Jaimal Chohan

アセンブリのpdbファイルがある場合、次のことを試すことができます。

try
{
    throw new Exception();
}
catch (Exception ex)
{
    // Get line number from the stack trace's top frame for the exception with source file information
    int linenumber = (new StackTrace(ex, true)).GetFrame(0).GetFileLineNumber();
}
5
chridam

他のすばらしい提案に加えて、私たちはIISに展開していました。ステージングサーバーと運用サーバーがありました。ステージングによってライン番号が提供され、生産では提供されなかったことを除いて、それらは同じように見えました。プロダクションのbinディレクトリに余分なDLL=(たまたまSqlServerSpatial.dll fwiw))があり、システムディレクトリに移動すると、ライン番号がプロダクションに表示されることがわかりました。

レッスンは、本番のbinディレクトリが開発のbinディレクトリとあらゆる点で確実に一致するようにすることでした(XMLファイルを除く)。

1
DJA