Visual C sharp でのトレースとデバッグ

この記事では、Visual C# でトレースとデバッグを行う方法について説明し、関連情報を説明するためのサンプル 手順をいくつか示します。

元の製品バージョン: Visual C#
元の KB 番号: 815788

概要

この記事の Microsoft Visual Basic .NET バージョンについては、「 Visual Basic .NET でトレース クラスとデバッグ クラスを使用する」を参照してください。

この記事では、.NET Framework クラス ライブラリ名前空間 System について説明します。 と クラスの使用方法 Debug を診断して説明します Trace 。 これらのクラスは、.NET Frameworkで使用できます。 これらのクラスを使用して、アプリケーションの開発中または運用環境へのデプロイ後に、アプリケーションのパフォーマンスに関する情報を提供できます。 これらのクラスは、.NET Frameworkで使用できるインストルメンテーション機能の一部にすぎません。

要件

次の一覧では、必要な推奨ハードウェア、ソフトウェア、ネットワーク インフラストラクチャ、およびサービス パックの概要を示します。

  • Microsoft Windows
  • Microsoft Visual C#

この記事では、プログラムのデバッグについて理解していることを前提としています。

手法の説明

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

プログラムの実行時には、 クラスのメソッドを Debug 使用して、プログラム実行シーケンスの監視、誤動作の検出、またはパフォーマンス測定情報の提供に役立つメッセージを生成できます。 既定では、クラスによって Debug 生成されるメッセージは、Visual Studio 統合開発環境 (IDE) の [出力] ウィンドウに表示されます。

サンプル コードでは、 メソッドを WriteLine 使用して、行終端記号が続くメッセージを生成します。 このメソッドを使用してメッセージを生成すると、各メッセージが [出力] ウィンドウに個別の行に表示されます。

クラスの Debug メソッドをAssert使用すると、指定した条件が false と評価された場合にのみ、[出力] ウィンドウにメッセージが表示されます。 メッセージは、ユーザーへのモーダル ダイアログ ボックスにも表示されます。 ダイアログ ボックスには、メッセージ、プロジェクト名、および が Debug含まれます。 Assert ステートメント番号。 ダイアログ ボックスには、次の 3 つのコマンド ボタンも含まれています。

  • 中止: アプリケーションの実行が停止します。

  • 再試行: アプリケーションがデバッグ モードになります。

  • 無視: アプリケーションが続行されます。 アプリケーションを続行するには、ユーザーがこれらのボタンのいずれかをクリックする必要があります。

クラスから出力ウィンドウ以外の Debug 宛先に出力を送信することもできます。 Debugクラスには、オブジェクトを含む Listener Listeners コレクションがあります。

各 Listener オブジェクトは、出力を Debug 監視し、指定されたターゲットに出力を転送します。

Listener コレクション内の各リスナーは、クラスが生成するすべての出力を Debug 受け取ります。 クラスを TextWriterTraceListener 使用してオブジェクトを定義 Listener します。 コンストラクターを使用して、クラスのターゲットを TextWriterTraceListener 指定できます。

次のような出力ターゲットが考えられます。

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

デバッグ クラスを使用してサンプルを作成する

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

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

  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. 出力を整理するには、 メソッドの省略可能な 2 番目の入力パラメーターとしてカテゴリを WriteLine 含めることができます。 カテゴリを指定すると、出力ウィンドウ メッセージの形式は "category: message" になります。たとえば、次のコードの最初の行には、[出力] ウィンドウに "フィールド: 製品名は 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. [出力] ウィンドウでは、 クラスの メソッドを使用 WriteLineIf して、指定された条件が true と評価された場合にのみメッセージを Debug 表示できます。 評価される条件は、 メソッドの最初の WriteLineIf 入力パラメーターです。 の 2 番目の WriteLineIf パラメーターは、最初のパラメーターの条件が true と評価された場合にのみ表示されるメッセージです。

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

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

    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 削除します。 メソッドと メソッドを一緒にUnindent使用Indentすると、リーダーは出力をグループとして区別できます。

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

    Debug.Flush();
    

トレース クラスの使用

クラスを Trace 使用して、アプリケーションの実行を監視するメッセージを生成することもできます。 クラスと Debug クラスはTrace、次のような同じメソッドの大部分を共有して出力を生成します。

  • WriteLine
  • WriteLineIf
  • Indent
  • Unindent
  • アサート
  • フラッシュ

クラスと クラスはTraceDebug、個別に使用することも、同じアプリケーションでまとめて使用することもできます。 デバッグ ソリューション構成プロジェクトでは、出力とDebug出力の両方Traceがアクティブです。 プロジェクトは、これらのクラスの両方からすべての Listener オブジェクトへの出力を生成します。 ただし、リリース ソリューション構成プロジェクトでは、クラスからの Trace 出力のみが生成されます。 Release Solution Configuration プロジェクトは、クラス メソッドの呼び出しを 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. [デバッグ] が現在のソリューション構成であることを確認します。

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

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

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

    注:

    Visual C# 2005 および Visual C# 2005 Express Edition で、conInfo ページで [デバッグ] をクリックします。

  5. [構成] フォルダーの上にある [構成] ドロップダウン リスト ボックスで、[アクティブ (デバッグ)] または [デバッグ] をクリックし、[OK] をクリックします。 Visual C# 2005 および Visual C# 2005 Express Edition で、[デバッグ] ページの [構成] ドロップダウン リスト ボックスで [アクティブ (デバッグ)] または [デバッグ] をクリックし、[ファイル] メニューの [保存] をクリックします。

  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
    ---- DEBUG ASSERTION FAILED ----
    ---- Assert Short Message ----
    Message will appear since dUnitcost < 1 is false
    ---- Assert Long Message ----
    
    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 受け取ります。 これは、 または クラスのメソッドを使用してAddクラスにDebug追加TextWriterTraceListenerするかどうかに関係なく発生しますListenersTrace

  • クラスと クラスでTrace同じターゲットのオブジェクトをDebug追加Listenersすると、出力の生成のTrace有無Debugに関係なく、出力の各行が複製されます。

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

関連情報