web-dev-qa-db-ja.com

例外なく.NETで現在のスタックトレースを印刷する方法

通常のC#コードがあります。 例外はありませんデバッグのために、現在のスタックトレースをプログラムで記録したい。例:

public void executeMethod() 
{
    logStackTrace();
    method();
}
306
Ricibald

System.Diagnostics 名前空間をご覧ください。たくさんのグッズがあります!

System.Diagnostics.StackTrace t = new System.Diagnostics.StackTrace();

これは、ボンネットの下で何が起こっているのかを知るために突っ込んでいるのは本当に良いことです。

目的に応じていくつかのロギングソリューション(NLog、log4net、Microsoftパターンおよびプラクティスエンタープライズライブラリなど)を確認することをお勧めします。がんばろう!

350
Spence

System.Diagnostics.StackTraceの代わりに System.Environment.StackTrace を使用して、スタックトレースの文字列表現を返します。

別の便利なオプションは、$CALLERおよび$CALLSTACKVisual Studioの変数のデバッグ を使用することです。これは、アプリケーションを再ビルドせずにランタイムで有効にできるためです。

195
larsmoa

これを行うには2つの方法があります。 System.Diagnostics.StackTrace()は、現在のスレッドのスタックトレースを提供します。 Threadインスタンスへの参照がある場合は、StackTrace()のオーバーロードバージョンを介して、そのスタックトレースを取得できます。

Stack Overflowの質問現在のスレッドのスタックトレースを取得する方法も確認してください。

37
Brian Rasmussen

コードを変更せずにVisual Studioデバッガーでこれを行うこともできます。

  1. スタックトレースを表示するブレークポイントを作成します。
  2. ブレークポイントを右クリックし、VS2015で[アクション...]を選択します。 VS2010で、[ヒット時...]を選択し、[メッセージの印刷]を有効にします。
  3. [実行を継続]が選択されていることを確認します。
  4. 印刷したいテキストを入力します。
  5. スタックトレースを表示する場所に$ CALLSTACKを追加します。
  6. デバッガーでプログラムを実行します。

もちろん、別のマシンでコードを実行している場合、これは役に立ちませんが、リリースコードに影響を与えずに、またはプログラムを再起動する必要もなく、スタックトレースを自動的に吐き出すことができると非常に便利です。

13
Hank Schultz
Console.WriteLine(
    new System.Diagnostics.StackTrace().ToString()
    );

出力は次のようになります。

yourNamespace.Program.executeMethod(String msg)で

yourNamespace.Program.Main(String [] args)

Console.WriteLineLogメソッドに置き換えます。実際、objectを受け入れるため、Console.WriteLineの場合は.ToString()の必要はありません。ただし、Log(string msg)メソッドにはそれが必要な場合があります。

3
epox