Trace クラスと Debug クラス
何が起きているかを把握するために、アプリケーションを 1 行ずつステップ実行する必要はありません。Systems.Diagnostics 名前空間には、Trace クラスと Debug クラスが含まれています。これら 2 つのクラスは基本的には同じクラスで、コード実行パス、コードの範囲、およびパフォーマンス プロファイルに関する情報を収集するために使用できる、多数の静的メソッドが含まれています。さらに、どちらのクラスにも Assert メソッドが用意されています。Assert メソッドは、条件を評価し、条件が false の場合にメッセージを表示します。
Trace クラスと Debug クラスを使用するには、次の 3 つの手順を実行します。
- TRACE シンボルまたは DEBUG シンボルを定義します。
- 対応する Listener の新しいインスタンスを作成します。
- Trace クラスまたは Debug クラスの呼び出しをコードに追加します。
定義 - デバッグまたはトレースを有効にするには、まず、対応するシンボルを定義する必要があります。Visual C# (および C++ マネージ拡張) または Visual Basic .NET の /d(efine) 条件付きコンパイル スイッチを使用すると、コンパイル時に定義を追加できます。このスイッチの例を次に示します。
csc /target:library /debug+ /d:TRACE math.cs
vbc /target:library /debug+ /d:TRACE=True math.vb
シンボルは、次のようにソース コード自体にも定義できます。
#define TRACE // for C# or the Managed Extensions for C++
#Const TRACE=1 ' for Visual Basic .NET
作成 - Debug クラスと Trace クラスの出力は、いずれも TraceListener によってキャプチャされます。既定では、出力は DefaultTraceListener に自動的に送られます。DefaultTraceListener は、出力を Windows API の OutputDebugString を使用して Windows システム デバッガに送信し、Debugger.Log メソッドを使用してデバッガにも送信します。デバッガがアタッチされていない場合、Debugger.Log を使用して送られたメッセージは無効です。
Windows ベースのデバッガで操作している場合は、[出力] ウィンドウに Debug メッセージと Trace メッセージが表示されます。ただし、テスト担当者のコンピュータなど、デバッガの外部で実行している場合や、デバッグ情報をテキスト ベースのログ ファイルに保存する場合は、新しい Listener を作成して Listeners コレクションに追加する必要があります。System.Diagnostic 名前空間には、EventLogTraceListener と TextWriterTraceListener が用意されています。テキスト ファイルを作成してデバッグ メッセージを処理するために必要なのは、次のような 1 行のコードだけです。
Trace.Listeners.Add(new
TextWriterTraceListener(File.Create("output.txt")));
追加 - 最後に、次のようにさまざまな Trace.Write メソッドの呼び出しを追加して、実行時にデバッグ情報を生成できます。
Trace.WriteLine("");
Trace.WriteLine("Starting tracing...");
出力ファイルの先頭の数バイトにはテキストのエンコーディングに関する情報が含まれますが、これは判読できないため、最初に空の WriteLine メソッドを実行し、改行でログを開始することをお勧めします。
次に、Trace.Indent の呼び出しについて説明します。既定では、この呼び出しによって出力が 4 スペース分インデントされます。
Trace.Indent();
Trace.Indent の後に Trace.Unindent を呼び出すと、出力は左に寄せられて以前の位置に戻ります。
このサンプル プログラムでは、ログ メッセージを生成するために Trace の WriteLineIf メソッドも使われますが、これは特定の条件が満たされた場合に限られます。この特定のサンプルでは、最初の数値エントリが 0 以外の数値で始まることを前提としています。この前提を確認するテストが失敗すると、メッセージが書き出されます。実際のコードを次の行に示します。
Trace.WriteLineIf(test == "0", "Oops: Leading zero"); // C#
Trace.WriteLineIf(test = "0", "Oops: Leading zero") ' VB
これらをすべてをまとめ、サンプル プログラムを実行すると、次のような Output.txt ファイルが作成されます。
Starting Tracing...
InitializeComponent()
Creating controls
Setting up Label and TextBox
Setting up numeric buttons
Setting up operations buttons
Adding Clear and Calculate
Adding to Controls collection
9 Clicked
- Clicked
6 Clicked
Calculate Clicked
Dispose()
Assert メソッドも同じように動作しますが、出力が詳細なエラー ダイアログ形式になり、テストの失敗時に表示されるという点が異なります。上記のコードに相当する Assert メソッドのコードは、次のようになります。
Trace.Assert(test != "0", "Oops", "Leading zero"); // C#
Trace.Assert(test <> "0", "Oops", "Leading zero") ' Visual Basic .NET
Calc.exe を実行し、先行するゼロを入力すると、次のようなダイアログ ボックスが表示されます。
**メモ **プログラムを最後まで実行できなかった場合は、0 バイトの Output.txt ファイルが生成されます。
参照
デバッグと最適化処理 | Microsoft CLR デバッガ | ASP.NET Web アプリケーションのデバッグ | 付録 A : 追加情報 | 付録 B : ランタイム デバッガ (CorDbg.exe)