2009-03-10 11 views
119

はリリースモードで配備.NETアセンブリのビルドのためのスタックトレースの行を/表示する方法はありますか?表示行数

UPDATE:

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

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

作業溶液

は、行番号の問題を修正しました。

答えて

119
  • スタックトレース行番号を表示するプロジェクトの[プロパティ]ウィンドウに移動します。
  • ビルドの「垂直タブ」をクリックします。
  • 「リリース」の設定を選択します。 DEBUG定数パラメータを確認してください。
  • チェックを外します(このステップは必須ではない)インラインコードと時折トレース問題を回避するために、パラメータ「コードの最適化」。
  • [詳細...]ボタンを押し、[出力] - [デバッグ情報] - > [pdbのみ]を選択します。
  • 生成された.pdbファイルをアセンブリと共に展開します。

は、以下のコメントで実装:

  • チェックするもうひとつは、「生成されたデバッグシンボルを除外する」チェックボックスにもチェックされていない「パッケージ/ Webの発行」セクションにある
+2

アセンブリと一緒にpdbファイルを展開する必要がありますか? –

+7

はい。それはデバッグシンボルと行番号がどこにあるのかです。 –

+4

この情報を公開する必要がない場合は、この情報を公開したくない可能性があります。それを使用してクライアントの問題をデバッグします。しかし、デバッグ情報が機密データを奪い、攻撃のベクトルになる可能性があるため、常にそうしたくはありません。あなたのアプリに応じて。 –

3

ビルド/デプロイメントパッケージにデバッグシンボルを含めます。

1

VS 2008 Expressでは、Project Properties - > Compile - > Advanced Compile Optionsの下にありました。

+0

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

13

私の解決策

実行可能ファイルと同じフォルダにpdbファイルをコピーします。

exeファイルを実行すると、今、私は行番号を表示することができます。

これは私がエラーを追跡するために、リリースビルドでPDBファイルを展開する必要性を感じ、過去の問題に実行した理由

http://msdn.microsoft.com/en-us/library/ee416588%28v=vs.85%29.aspx

7

です。その理由は、あなたが言ったように、非常に大きなメソッドで例外が発生し、どこに発生したのかを正確に特定できないということでした。

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

単なる考えです。

+0

これです。そして、あなたが行くにつれて、より細かい穀粒でもっとスケッチした場所でキャッチを試みてください。そして、仮説を立てなければならない場合、これらの機能の始めにガードを増やしてください。 –

+0

しかし、しばしば言われていることですが、それは残念です。プログラマーは新しい大きなメソッドを書いています。そして実際には大きなメソッドが実際には最高のものです(分割することは混乱しているかYAGNIです)。さらに、5行の方法であっても、検索範囲を5倍に絞り込むことができるので、PDBはシンボルサーバーを使用して苦労しない限り、生産上必要な悪です – FastAl

15

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

-3

これは毎回動作します。スタックトレースメッセージを部分文字列にするだけで済みます。本当に簡単!また、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++; 
} 
+0

実際に素敵なフォーマットはしていません。 –

-2

try { // your method } catch (Exception ex) { // log-> ex.ToString(); // it will give you whole exception including line number and
// file name }
Plusは、それは例外が発生した場合にのみ、メソッド名が表示されます賢明な他の全体の例外を取得するには、展開中(binフォルダから)の.pdbファイルを含めます。