Trace クラスと Debug クラス

何が起きているかを把握するために、アプリケーションを 1 行ずつステップ実行する必要はありません。Systems.Diagnostics 名前空間には、Trace クラスと Debug クラスが含まれています。これら 2 つのクラスは基本的には同じクラスで、コード実行パス、コードの範囲、およびパフォーマンス プロファイルに関する情報を収集するために使用できる、多数の静的メソッドが含まれています。さらに、どちらのクラスにも Assert メソッドが用意されています。Assert メソッドは、条件を評価し、条件が false の場合にメッセージを表示します。

Trace クラスと Debug クラスを使用するには、次の 3 つの手順を実行します。

  1. TRACE シンボルまたは DEBUG シンボルを定義します。
  2. 対応する Listener の新しいインスタンスを作成します。
  3. 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 名前空間には、EventLogTraceListenerTextWriterTraceListener が用意されています。テキスト ファイルを作成してデバッグ メッセージを処理するために必要なのは、次のような 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 を呼び出すと、出力は左に寄せられて以前の位置に戻ります。

このサンプル プログラムでは、ログ メッセージを生成するために TraceWriteLineIf メソッドも使われますが、これは特定の条件が満たされた場合に限られます。この特定のサンプルでは、最初の数値エントリが 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)