Visual C# でトレースとデバッグを実行する方法

Microsoft Visual Basic .NET については、次の資料を参照してください。313417
この資料では、次の Microsoft .NET Framework クラス ライブラリの名前空間を参照しています。

  • System.Diagnostics

この資料の内容

概要

この資料では、Debug クラスと Trace クラスの使用方法について説明します。Debug クラスと Trace クラスは Microsoft .NET Framework で利用できます。これらのクラスを使用すると、アプリケーションの開発段階または実働環境への導入後に、アプリケーションのパフォーマンスに関する情報を提供できます。これらのクラスは .NET Framework で利用可能な制御機能のほんの一部です。



先頭に戻る

必要条件

次の一覧は、推奨する必要なハードウェア、ソフトウェア、ネットワーク インフラストラクチャ、および Service Pack です。


  • Microsoft Windows 2000、Microsoft Windows XP、または Microsoft Windows Server 2003
  • Microsoft Visual C#
この資料は、プログラムのデバッグに習熟しているユーザーを対象としています。



先頭に戻る

方法の説明


Debug クラスを使用するサンプルの作成」の手順では、Debug クラスを使用して、プログラム実行時の情報を提供するコンソール アプリケーションを作成します。



Debug クラスのメソッドを使用すると、プログラムの実行シーケンスの監視、問題の検出、パフォーマンス計測データの提供に役立つメッセージがプログラムの実行時に生成されます。Debug クラスによって生成されたメッセージは、デフォルトでは Visual Studio の統合開発環境 (IDE) の出力ウィンドウに表示されます。



サンプル コードでは、WriteLine メソッドを使用して、行ターミネータで終わるメッセージを生成します。このメソッドを使用して生成されたメッセージは、メッセージごとに改行されて、出力ウィンドウに表示されます。



Debug クラスの Assert メソッドを使用すると、指定された条件が False と評価された場合にのみ、出力ウィンドウにメッセージが表示されます。このメッセージは、ユーザーに対するモーダル ダイアログ ボックスにも表示されます。このダイアログ ボックスには、メッセージ、プロジェクト名、Debug.Assert のステートメント番号、および以下の 3 種類のコマンド ボタンが表示されます。


  • 中止 : このボタンをクリックするとアプリケーションが停止します。

  • 再試行 : このボタンをクリックするとアプリケーションがデバッグ モードに切り替わります。

  • 無視 : このボタンをクリックするとアプリケーションが続行されます。

ユーザーがいずれかのボタンをクリックしない限り、アプリケーションの処理は続行されません。



Debug クラスの出力は、出力ウィンドウ以外の出力先にも出力できます。この Debug クラスには、Listener オブジェクトを含む "Listeners" という名前のコレクションがあります。



各 Listener オブジェクトは、Debug クラスからの出力を監視し、指定された出力先に出力します。



Listener コレクションの各 Listener オブジェクトは、Debug クラスによって生成された出力を受け取ります。Listener オブジェクトを定義するには、TextWriterTraceListener クラスを使用します。TextWriterTraceListener クラスの出力先は、コンストラクタを使用して指定できます。



たとえば、出力先に以下のものを指定できます。

  • コンソール ウィンドウ (System.Console.Out プロパティを使用)
  • テキスト (.txt) ファイル (System.IO.File.CreateText("FileName.txt") ステートメントを使用)
Debug クラスの出力を受け取るには、TextWriterTraceListener オブジェクトの作成後に、そのオブジェクトを Debug.Listeners コレクションに追加する必要があります。



先頭に戻る

Debug クラスを使用するサンプルの作成

  1. Visual Studio または Visual C# Express Edition を起動します。

  2. "conInfo" という名前の Visual C# の新しいコンソール アプリケーション プロジェクトを作成します。Visual Studio .NET では、Class1 が作成されます。Visual Studio 2005 では、Program.cs が作成されます。

  3. 次の名前空間を Class1 または Program.cs の先頭に追加します。

    using System.Diagnostics;
  4. 製品情報を含んだ状態で変数が初期化されるように、Main メソッドに次の宣言ステートメントを追加します。

    string sProdName = "Widget";
    int iUnitQty = 100;
    double dUnitCost = 1.03;
  5. WriteLine メソッドの最初の入力パラメータとして、クラスから生成されるメッセージを指定します。Ctrl + Alt + O キーを押して、出力ウィンドウを表示します。

    Debug.WriteLine("Debug Information-Product Starting ");
  6. 出力ウィンドウでの読みやすさを考慮し、Indent メソッドを使用して後続のメッセージを字下げします。

    Debug.Indent();
  7. 選択した変数の内容を表示するには、WriteLine メソッドを次のように使用します。

    Debug.WriteLine("The product name is " + sProdName);
    Debug.WriteLine("The available units on hand are" + iUnitQty.ToString());
    Debug.WriteLine("The per unit cost is " + dUnitCost.ToString());
  8. WriteLine メソッドは、既存のオブジェクトの名前空間とクラス名の表示にも利用できます。たとえば、次のコードを入力すると、出力ウィンドウに System.Xml.XmlDocument 名前空間が表示されます。

    System.Xml.XmlDocument oxml = new System.Xml.XmlDocument();
    Debug.WriteLine(oxml);
  9. 出力を整形するため、WriteLine メソッドの 2 番目の入力パラメータ (省略可能) としてカテゴリを指定できます。カテゴリを指定すると、出力ウィンドウのメッセージは、"category: message" の形式で表示されます。たとえば、以下のコードの先頭の行を実行すると、出力ウィンドウには "Field: The product name is Widget" と表示されます。

    Debug.WriteLine("The product name is " + sProdName,"Field");
    Debug.WriteLine("The units on hand are" + iUnitQty,"Field");
    Debug.WriteLine("The per unit cost is" + dUnitCost.ToString(),"Field");
    Debug.WriteLine("Total Cost is " + (iUnitQty * dUnitCost),"Calc");
  10. Debug クラスの WriteLineIf メソッドを使用すると、指定した条件が True と評価された場合にのみ、メッセージが出力ウィンドウに表示されます。このとき、WriteLineIf メソッドの最初の入力パラメータが、条件として評価されます。WriteLineIf の 2 番目のパラメータには、最初のパラメータの条件が True と評価された場合にのみ表示するメッセージを指定します。

    Debug.WriteLineIf(iUnitQty > 50, "This message WILL appear");
    Debug.WriteLineIf(iUnitQty < 50, "This message will NOT appear");
  11. 指定した条件が False と評価された場合にのみ、出力ウィンドウにメッセージを表示するには、以下のように Debug クラスの Assert メソッドを使用します。

    Debug.Assert(dUnitCost > 1, "Message will NOT appear");
    Debug.Assert(dUnitCost < 1, "Message will appear since dUnitcost < 1 is false");
  12. コンソール ウィンドウ (tr1) と Output.txt という名前のテキスト ファイル (tr2) のそれぞれに対応する TextWriterTraceListener オブジェクトを作成し、作成したオブジェクトを Debug Listeners コレクションに追加します。

    TextWriterTraceListener tr1 = new TextWriterTraceListener(System.Console.Out);
    Debug.Listeners.Add(tr1);

    TextWriterTraceListener tr2 = new TextWriterTraceListener(System.IO.File.CreateText("Output.txt"));
    Debug.Listeners.Add(tr2);
  13. 読みやすさを考慮し、Unindent メソッドを使用して、Debug クラスから生成される後続のメッセージの字下げを解除します。Indent メソッドと Unindent メソッドを併用することで出力がグループ分けされ、読みやすくなります。

    Debug.Unindent();
    Debug.WriteLine("Debug Information-Product Ending");
  14. 個々の Listener オブジェクトがすべての出力をもれなく受け取れるよう、Debug クラスのバッファに対して Flush メソッドを呼び出します。

    Debug.Flush();
先頭に戻る

Trace クラスの使用

アプリケーションの実行状況を監視するメッセージは、Trace クラスを使用して生成することもできます。以下に示すように、出力の生成に使用するメソッドはその大半が Trace クラスと Debug クラスで共通しています。

  • WriteLine
  • WriteLineIf
  • Indent
  • Unindent
  • Assert
  • Flush
Trace クラスと Debug クラスは同じアプリケーション内で、個別または同時に使用できます。Debug ソリューション構成のプロジェクトでは、Trace クラスの出力と Debug クラスの出力は両方ともアクティブであるため、すべての Listener オブジェクトに対して両方のクラスからの出力が生成されます。これに対して、Release ソリューション構成のプロジェクトでは、Trace クラスの出力のみ生成されます。Debug クラスのメソッドによる呼び出しはすべて無視されます。

Trace.WriteLine("Trace Information-Product Starting ");
Trace.Indent();

Trace.WriteLine("The product name is "+sProdName);
Trace.WriteLine("The product name is"+sProdName,"Field" );
Trace.WriteLineIf(iUnitQty > 50, "This message WILL appear");
Trace.Assert(dUnitCost > 1, "Message will NOT appear");

Trace.Unindent();
Trace.WriteLine("Trace Information-Product Ending");

Trace.Flush();

Console.ReadLine();
先頭に戻る

動作の検証

  1. 現在のソリューション構成が Debug であることを確認します。

  2. [ソリューション エクスプローラ] ウィンドウが表示されていない場合は、Ctrl + Alt + L キーを押して表示します。

  3. [conInfo] を右クリックし、[プロパティ] をクリックします。

  4. [conInfo プロパティ ページ] の左側のウィンドウで、[構成プロパティ] フォルダの下の [デバッグ] の横に矢印があることを確認します。



    : Visual C# 2005 および Visual C# 2005 Express Edition の場合は、[conInfo] タブの [デバッグ] をクリックします。

  5. [構成プロパティ] フォルダの上にある [構成] ボックスの一覧の [アクティブ(Debug)] または [Debug] をクリックし、[OK] をクリックします。Visual C# 2005 および Visual C# 2005 Express Edition の場合は、[デバッグ] ページの [構成] ボックスの一覧の [アクティブ(Debug)] または [Debug] をクリックし、[ファイル] メニューの [選択したファイルを上書き保存] をクリックします。

  6. Ctrl + Alt + O キーを押して出力ウィンドウを表示します。

  7. F5 キーを押してコードを実行します。[アサートに失敗しました] ダイアログ ボックスが表示されたら [無視] をクリックします。

  8. コンソール ウィンドウで Enter キーを押します。これによりプログラムが終了し、出力ウィンドウに次のような内容が表示されます。

        Debug Information-Product Starting 
    The product name is Widget
    The available units on hand are100
    The per unit cost is 1.03
    System.Xml.XmlDocument
    Field: The product name is Widget
    Field: The units on hand are100
    Field: The per unit cost is1.03
    Calc: Total Cost is 103
    This message WILL appear
    ---- デバッグ アサート失敗 ----
    ---- 短いメッセージのアサート ----
    Message will appear since dUnitcost < 1 is false
    ---- 長いメッセージのアサート ----


    at Class1.Main(String[] args) <%Path%>\class1.cs(34)

    The product name is Widget
    The available units on hand are100
    The per unit cost is 1.03
    Debug Information-Product Ending
    Trace Information-Product Starting
    The product name is Widget
    Field: The product name isWidget
    This message WILL appear
    Trace Information-Product Ending

  9. コンソール ウィンドウと Output.txt ファイルには、次の内容が出力されます。

    The product name is Widget
    The available units on hand are 100
    The per unit cost is 1.03
    Debug Information-Product Ending
    Trace Information-Product Starting
    The product name is Widget
    Field: The product name is Widget
    This message WILL appear
    Trace Information-Product Ending
: Output.txt ファイルは、conInfo 実行可能ファイル (conInfo.exe) と同じディレクトリにあります。通常、これは、プロジェクトのソースが保存されている \bin フォルダです。デフォルトでは、このフォルダは、C:\Documents and Settings\User login\My Documents\Visual Studio Projects\conInfo\bin です。Visual C# 2005 および Visual C# 2005 Express Edition の場合、Output.txt ファイルは次のフォルダにあります。

C:\Documents and Settings\User login\My Documents\Visual Studio 2005\Projects\conInfo\conInfo\bin\Debug


先頭に戻る

完全なコード リスト

   using System;
using System.Diagnostics;

class Class1
{
[STAThread]
static void Main(string[] args)
{
string sProdName = "Widget";
int iUnitQty = 100;
double dUnitCost = 1.03;
Debug.WriteLine("Debug Information-Product Starting ");
Debug.Indent();
Debug.WriteLine("The product name is "+sProdName);
Debug.WriteLine("The available units on hand are"+iUnitQty.ToString());
Debug.WriteLine("The per unit cost is "+ dUnitCost.ToString());

System.Xml.XmlDocument oxml = new System.Xml.XmlDocument();
Debug.WriteLine(oxml);

Debug.WriteLine("The product name is "+sProdName,"Field");
Debug.WriteLine("The units on hand are"+iUnitQty,"Field");
Debug.WriteLine("The per unit cost is"+dUnitCost.ToString(),"Field");
Debug.WriteLine("Total Cost is "+(iUnitQty * dUnitCost),"Calc");

Debug.WriteLineIf(iUnitQty > 50, "This message WILL appear");
Debug.WriteLineIf(iUnitQty < 50, "This message will NOT appear");

Debug.Assert(dUnitCost > 1, "Message will NOT appear");
Debug.Assert(dUnitCost < 1, "Message will appear since dUnitcost < 1 is false");

TextWriterTraceListener tr1 = new TextWriterTraceListener(System.Console.Out);
Debug.Listeners.Add(tr1);

TextWriterTraceListener tr2 = new TextWriterTraceListener(System.IO.File.CreateText("Output.txt"));
Debug.Listeners.Add(tr2);


Debug.WriteLine("The product name is "+sProdName);
Debug.WriteLine("The available units on hand are"+iUnitQty);
Debug.WriteLine("The per unit cost is "+dUnitCost);
Debug.Unindent();
Debug.WriteLine("Debug Information-Product Ending");
Debug.Flush();

Trace.WriteLine("Trace Information-Product Starting ");
Trace.Indent();

Trace.WriteLine("The product name is "+sProdName);
Trace.WriteLine("The product name is"+sProdName,"Field" );
Trace.WriteLineIf(iUnitQty > 50, "This message WILL appear");
Trace.Assert(dUnitCost > 1, "Message will NOT appear");


Trace.Unindent();
Trace.WriteLine("Trace Information-Product Ending");

Trace.Flush();

Console.ReadLine();
}
}


先頭に戻る

トラブルシューティング

  • ソリューション構成の種類が Release の場合、Debug クラスの出力は無視されます。

  • 特定の出力先に対して TextWriterTraceListener クラスを作成した場合、TextWriterTraceListener は Trace および Debug の両方のクラスから出力を受け取ります。Listeners クラスに TextWriterTraceListener を追加する場合、どちらのクラスの Add メソッドを使用しても、この動作に変わりはありません。

  • Trace クラスと Debug クラスで、同じ出力先に対して Listeners オブジェクトを追加した場合、どちらのクラスから出力が生成されても、同じ行が 2 回ずつ出力されます。

             TextWriterTraceListener myWriter = new TextWriterTraceListener(System.Console.Out);
    Debug.Listeners.Add(myWriter);

    TextWriterTraceListener myCreator = new TextWriterTraceListener(System.Console.Out);
    Trace.Listeners.Add(myCreator);

先頭に戻る

関連情報

詳細については、.NET Framework クラス ライブラリにある次のトピックを参照してください。

先頭に戻る
プロパティ

文書番号:815788 - 最終更新日: 2008/07/11 - リビジョン: 1

フィードバック