2016-05-08 7 views
2

メソッドのコールスタックを見るのに役立つ汎用ロガーを実装したいと思います。C#メソッド内でスタックトレースを取得

System.Diagnosticのいくつかのメソッドがありますが、それらは.net 4.0で導入されました。だから私はもっと普遍的な解決策を持っていたい。

別の問題は、いくつか混乱を招くasync \ awaitです。

私はいくつかのコンテキストを保存し、コールスタックを決定するのに役立つ各メソッドに追加のパラメータを渡していますが、この解決法は少し複雑です。

また、安全でないコードを使用してスレッドスタックメモリを読み込み、自分自身でコールスタックをチェックできますが、信頼性がありません。

他に解決策はありますか?

+1

あなたは確かに周りにそれをハック可能性: – MarcinJuraszek

+0

@MarcinJuraszekニースはハック:)、例外をスローし、それをキャッチし、それから、コールスタックを読んで:)私はそれがあまりにも多くのパフォーマンスに影響します怖いです。 – Neir0

答えて

2

Environment.StackTraceを使用できます。それは当初からフレームワークの一部となっています。

Environment.StackTraceは完全なスタックトレース(Environment.StackTranceへの呼び出しを含む)を行で区切られた文字列として返します。

このような何か:WpfApplication2.MainWindow.GetStack(のInt32 removeLines)でSystem.Environment.get_StackTraceでSystem.Environment.GetStackTrace(例外e、ブールneedFileInfo)で


()

WpfApplication2.MainWindow.Button_Click(オブジェクト送信者、RoutedEventArgs e)の
で ... System.Threading.ThreadHelper.ThreadStart()で

あなたがしなければならないことは、あなたが分割/解析/書式設定するだけです。

これは自分のクラス内で使用するので、最新のX行を削除してください。

このコードは意図的に低レベルなのでどこでも動作します。

private static string[] GetStack(int removeLines) 
{ 
    string[] stack = Environment.StackTrace.Split(
     new string[] {Environment.NewLine}, 
     StringSplitOptions.RemoveEmptyEntries); 

    if(stack.Length <= removeLines) 
     return new string[0]; 

    string[] actualResult = new string[stack.Length - removeLines]; 
    for (int i = removeLines; i < stack.Length; i++) 
     // Remove 6 characters (e.g. " at ") from the beginning of the line 
     // This might be different for other languages and platforms 
     actualResult[i - removeLines] = stack[i].Substring(6); 

    return actualResult; 
} 
+0

パーフェクト。それは動作します! – Neir0

+1

1つのメモ、.netは異なる言語のスタックトレース出力を持っているので、 "at"やその他の言語に依存する単語を削除する際は注意が必要です。 – Neir0

+0

良い考え。私は将来の参考のために答えにそれを含めるでしょう。 –

関連する問題