リリースモードの.NETアセンブリのスタックトレースに行番号を表示する


139

リリースモードでビルド/デプロイされた.NETアセンブリのスタックトレースに行を表示する方法はありますか?

更新:

私のアプリケーションは、3つのクラスライブラリプロジェクトと1つのASP.NET "website"プロジェクトに分かれています。私が追跡しようとしているエラーは、3つのクラスライブラリプロジェクトの1つです。「オブジェクト参照がオブジェクトのインスタンスに設定されていません」エラーを生成しているクラスライブラリプロジェクトのpdbファイルのみをデプロイしました。

行番号はまだスタックトレースに表示されません。スタックトレースの行番号を取得するには、すべてのプロジェクトのpdbファイルをデプロイする必要がありますか?

実用的なソリューション

アプリケーションごとにpdbファイルをデプロイすると、行番号の問題が修正されました。

回答:


147
  • スタックトレースの行番号を表示するプロジェクトの[プロパティ]ウィンドウに移動します。
  • ビルド「垂直タブ」をクリックします。
  • 「リリース」構成を選択します。DEBUG定数パラメーターを確認してください。
  • 「コードの最適化」パラメーターをオフにして、インライン化されたコードでのトレースの問題を回避します(このステップは必須ではありません)。
  • Advanced ...ボタンを押し、Output-> Debug Info-> pdb-onlyを選択します。
  • 生成された.pdbファイルをアセンブリと共に展開します。

以下のコメントで実装:

  • チェックするもう1つのことは、[パッケージ/パブリッシュWeb]セクションで、[生成されたデバッグシンボルを除外する]チェックボックスもオフになっていることです。

2
アセンブリと共にpdbファイルを展開する必要がありますか?
マイケルクニスカーン2009年

7
はい。ここにデバッグシンボルと行番号があります。
ジョンサンダース

5
この情報を公開する必要がない場合は、公開したくないでしょう。はい、クライアントの問題をデバッグするために使用します。ただし、デバッグ情報は機密データを提供し、攻撃ベクトルになる可能性があるため、常にそうしたいとは限りません。アプリの内容によって異なります。
i_am_jorf 2009年

6
@Carlo:デバッグ情報はリリース(最適化)コードでも機能しますが、デバッグは多少制限されます(stackoverflow.com/questions/113866)。ただし、インライン化された関数や、呼び出しxxx / retシーケンスがjmp xxxに置き換えられたために末尾呼び出しが欠落する場合がある例外を除いて、呼び出しスタックは最適化されたコードでも非常に信頼できます。
スマ

12
チェックするもう1つのことは、[Package / Publish Web]セクションで、[Exclude generated debug symbols]チェックボックスもオフになっていることです
Gaz

17

VS2012では、プロパティの[パッケージ/パブリッシュWeb]セクションでも[生成されたデバッグシンボルを除外する]をオフにする必要があります。


または、デスクトップアプリの場合は、PDBファイルが展開されていることを確認してください
CADが


9

エラーを追跡するためにリリースビルドでPDBファイルを展開する必要があると感じた過去の問題に遭遇しました。その理由は、あなたが言ったように、例外が非常に大きいメソッドで発生し、どこで発生しているか正確に特定できなかったためです。

これは、メソッドをより小さく、より詳細なメソッドにリファクタリングする必要があることを示している可能性があります。1つのサイズですべての答えに当てはまるわけではありませんが、このアプローチは短期的に(リファクタリング中にバグを頻繁に発見しました)、長期的にはうまく機能しました。

ちょっとした考え。


この。そして、あなたが行くように、より大ざっぱなより大ざっぱな場所でキャッチを投げてください。想定を行う必要がある場合は、これらの関数の最初にガードを増やします。
Gerard ONeill、2015年

よく言われ、真実ですが、レガシーがあり、新しい大きなメソッドを書いているプログラマーがいます、そして時には大きなメソッドが実際に行うのが最善です(それを分割すると混乱するか、YAGNI)。さらに、5行の方法の場合でも、検索を5倍に絞り込みます。つまり、シンボルサーバーの使用に苦労しない限り、PDBは本番環境で必要な悪です
FastAl


0

VS 2008 Expressでは、[プロジェクトのプロパティ]-> [コンパイル]-> [詳細なコンパイルオプション]にあります。


1
あなたは何を見つけましたか?完全な回答を投稿したくない場合は、コメントを投稿できます。
jumxozizi

-4

これは毎回機能します。スタックトレースメッセージを部分文字列化する必要があるだけです。本当に簡単!また、vb.netでは、「すべてのファイルを表示」を実行し、pdbを含める必要があります。

'Err is the exception passed to this function

Dim lineGrab As String = err.StackTrace.Substring(err.StackTrace.Length - 5)
Dim i As Integer = 0
While i < lineGrab.Length                   
    If (IsNumeric(lineGrab(i))) Then
        lineNo.Append(lineGrab(i))
    End If
    i += 1
End While

'LineNo holds the number as a string

C#バージョン:

string lineGrab = error.StackTrace.Substring(error.StackTrace.Length - 5);

int i = 0;
int value;
while (i < lineGrab.Length)
{
    if (int.TryParse(lineGrab[i].ToString(), out value))
    {
        strLineNo.Append(lineGrab[i]);
    }
    i++;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.