2008-09-09 15 views
50

私たちの製品で何らかのエラー処理の一部として、スタックトレース情報をダンプしたいと思います。しかし、多くのユーザーは、プログラムから入手可能な完全なレポートのコピーを私たちに送信するのではなく、単にエラーメッセージダイアログのスクリーンショットをとることになるので、このダイアログで最小限のスタックトレース情報を利用したいと考えています。私のマシンでC#のスタックトレース情報を出力してください

.NETスタックトレースは次のようになります。

at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) 
at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy) 
at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options) 
at System.IO.StreamReader..ctor(String path, Encoding encoding, Boolean detectEncodingFromByteOrderMarks, Int32 bufferSize) 
at System.IO.StreamReader..ctor(String path) 
at LVKWinFormsSandbox.MainForm.button1_Click(Object sender, EventArgs e) in C:\Dev\VS.NET\Gatsoft\LVKWinFormsSandbox\MainForm.cs:line 36 

私はこの質問を持っている:

形式はこのようになります。

at <class/method> [in file:line ##] 

しかし、キーワードでは、ノルウェーの.NETランタイムiを実行するとローカライズされていると見なされます私がインストールした英語のnstead。

このスタックトレースを言語に依存しない方法で選択する方法はありますか。これにより、このエントリのファイルと行番号のみを表示できますか?

は、言い換えれば、私は上記のテキストからこの情報が欲しい:あなたが与えることができる

C:\Dev\VS.NET\Gatsoft\LVKWinFormsSandbox\MainForm.cs:line 36 

何かアドバイスが参考になります。

+1

と(リンドホルムの回答に基づいて)本当にこれについていくつかの詳細を得たいと思っていました。あなたがStackTraceのソースを制御できるとすれば、実際に正しい答えを選んだのです:) – TheXenocide

答えて

70

あなたはその後、フレームワークのフォーマットに依存することなく、自分のフレームを見ることができます

var trace = new System.Diagnostics.StackTrace(exception); 

言って、文字列の代わりにスタックトレースオブジェクトを取得することができるはずです。また

参照:別の方法としてStackTrace reference

+0

うわー、いい、私はそれを知らなかった!私は間違いなくこれを調べます。 –

+0

リリースモードでは、例外のスタックトレースを正確に取得できますか? – erdogany

+0

**ファイル内で例外**をシリアライズします。 'SerializationHelper.Serialize(@" c:\ temp \ ConfigurationErrorsExceptions.ser "、ex);'ファイルから直列化解除すると 'var exception = SerializationHelper.Deserialize(@" ConfigurationErrorsExceptions.ser ");' ***トレース***使用可能ではありません_ var trace = new System.Diagnostics.StackTrace(Exceptionとして例外); ** FrameCount **は0 – Kiquenet

0

、log4netのは、潜在的に危険なのに、私たSystem.Diagnosticsよりも良い結果を与えています。基本的にlog4netには、さまざまなログレベルのためのメソッドがあり、それぞれに例外パラメータがあります。したがって、2番目の例外を渡すと、設定したアペンダーにスタックトレースが出力されます。

は例:Logger.Error("Danger!!!", myException);

出力、構成に応じて、ここで

System.ApplicationException: Something went wrong. 
    at Adapter.WriteToFile(OleDbCommand cmd) in C:\Adapter.vb:line 35 
    at Adapter.GetDistributionDocument(Int32 id) in C:\Adapter.vb:line 181 
    ... 
+0

です。log4netが "潜在的に危険"であることを明確にしてください。 –

+0

私は確かOglesterが何を意味するのか分かりませんが、log4netがデータベースに例外を記録していたので、stackoverflow.comにデッドロックの問題があることがわかりました。私は個人的に問題はありませんでしたが、私はそれをシンプルに保ち、ローリングテキストファイルに固執します。 –

+0

参照を適切に管理しないと、メモリリークが発生します。私がしばらく働いていたウェブサイトは、log4netを広範囲に(ローリングファイル)使用しています。 log4netはファイル(安全でない)を参照するので、log4net参照をクリーンアップまたは最小限に保つ必要があります。 –

27

のようなものは、私はちょうどにするために例外

public static void LogStack() 
{ 
    var trace = new System.Diagnostics.StackTrace(); 
    foreach (var frame in trace.GetFrames()) 
    { 
    var method = frame.GetMethod(); 
    if (method.Name.Equals("LogStack")) continue; 
    Log.Debug(string.Format("{0}::{1}", 
     method.ReflectedType != null ? method.ReflectedType.Name : string.Empty, 
     method.Name)); 
    } 
} 
+0

これは、例外ハンドラがネイティブで実行するので、これはどこかで機能的に構築されると思うでしょう。 –

18

せずにこれを行うために使用するコードです見えますこれは15秒コピーペーストの回答:

static public string StackTraceToString() 
{ 
    StringBuilder sb = new StringBuilder(256); 
    var frames = new System.Diagnostics.StackTrace().GetFrames(); 
    for (int i = 1; i < frames.Length; i++) /* Ignore current StackTraceToString method...*/ 
    { 
     var currFrame = frames[i]; 
     var method = currFrame.GetMethod(); 
     sb.AppendLine(string.Format("{0}:{1}",      
      method.ReflectedType != null ? method.ReflectedType.Name : string.Empty, 
      method.Name)); 
    } 
    return sb.ToString(); 
} 

+3

ありがとうございます。 sb.AppendLine(...)を使用すると、特定の行末文字をハードコーディングしないようにすることができます。 –

+0

更新しました... –

8

あるいは短いバージョンがある..私は、任意のアプリケーションからのログに記録された文字列で働いていると私は、誰かがこのために解析答えを与えていることを望む

Console.Write(exception.StackTrace); 
関連する問題