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

文書翻訳 文書翻訳
文書番号: 815788 - 対象製品
Microsoft Visual Basic .NET については、次の資料を参照してください。313417
すべて展開する | すべて折りたたむ

目次

概要

この資料では、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 クラス ライブラリにある次のトピックを参照してください。
Trace クラス
http://msdn2.microsoft.com/ja-jp/library/system.diagnostics.trace(VS.80).aspx

Debug クラス
http://msdn2.microsoft.com/ja-jp/library/system.diagnostics.debug(VS.80).aspx

プロパティ

文書番号: 815788 - 最終更新日: 2008年4月17日 - リビジョン: 4.5
この資料は以下の製品について記述したものです。
  • Microsoft Visual C# 2008 Express Edition
  • Microsoft Visual C# 2005 Express Edition
  • Microsoft Visual C# 2005
  • Microsoft Visual C# .NET 2003 Standard Edition
  • Microsoft Visual C# .NET 2002 Standard Edition
キーワード:?
kbprogramming kbdebug kbnamespace kbhowtomaster KB815788
"Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。"

フィードバック

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com