Visual Basic 2005 または Visual Basic .NET でのトレースとデバッグ方法

文書翻訳 文書翻訳
文書番号: 313417 - 対象製品
この記事は、以前は次の ID で公開されていました: JP313417
Microsoft Visual Basic 6.0 については、次の資料を参照してください。161153
すべて展開する | すべて折りたたむ

目次

概要

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

必要条件

必要なハードウェア、ソフトウェア、ネットワーク インフラストラクチャ、および Service Pack は次のとおりです。
  • Microsoft Windows 2000 または Microsoft Windows XP
  • Microsoft Visual Basic 2005 または Microsoft Visual Basic .NET
この資料は、プログラムのデバッグについて詳しい知識のあるユーザーを対象としています。

技法の説明

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

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

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

Debug クラスの Assert メソッドを使用すると、指定された条件が False と評価された場合にのみ、出力ウィンドウにメッセージが表示されます。ユーザーに対するメッセージは、モーダル ダイアログ ボックスに表示されます。このダイアログ ボックスには、メッセージ、プロジェクト名、Debug.Assert のステートメント番号、および以下の 3 種類のコマンド ボタンが表示されます。
  • 中止 : このボタンをクリックすると、アプリケーションが停止します。
  • 再試行 : このボタンをクリックすると、アプリケーションがデバッグ モードに入ります。
  • 無視 : このボタンをクリックすると、アプリケーションが続行されます。
ユーザーがいずれかのボタンをクリックしない限り、アプリケーションの処理は続行されません。

Debug クラスからの出力は、出力ウィンドウ以外の出力先にも出力できます。Debug クラスには、Listener オブジェクトを含む "Listeners" という名前のコレクションがあります。個々の Listener オブジェクトが Debug クラスからの出力を監視し、指定された出力先へ出力します。また、Listeners コレクションの各 Listener オブジェクトは Debug クラスで生成された内容を受信します。Listener オブジェクトを定義するには、TextWriterTraceListener クラスを使用します。TextWriterTraceListener クラスの出力先は、コンストラクタを使用して指定できます。主な出力先を次に示します。
  • コンソール ウィンドウ (System.Console.Out プロパティを使用)
  • テキスト (.txt) ファイル (System.IO.File.CreateText("FileName.txt")) ステートメントを使用)
Debug クラスの出力を受け取るには、TextWriterTraceListener オブジェクトを作成後、そのオブジェクトを Debug.Listeners コレクションに追加する必要があります。

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

  1. Visual Basic 2005 または Visual Basic .NET を使用して、conInfo という名前の新しいコンソール アプリケーション プロジェクトを作成します。プロジェクトにはデフォルトで、Module1 という名前のパブリック モジュールが追加されます。
  2. 変数が製品情報で初期化されるように、次の Dim ステートメントを追加します。
    Dim sProdName As String = "Widget"
    Dim iUnitQty As Integer = 100
    Dim dUnitCost As Decimal = 1.03
    					
  3. WriteLine メソッドの最初の入力パラメータとして、クラスから生成されるメッセージを指定します。Ctrl + Alt + O キーを押して、出力ウィンドウが表示されることを確認します。
    Debug.WriteLine("Debug Information-Product Starting ")
    					
  4. 出力ウィンドウでの読みやすさを考慮し、Indent メソッドを使用して後続のメッセージを字下げします。
    Debug.Indent()
    					
  5. 選択した変数の内容を表示するには、WriteLine メソッドを次のように使用します。
    Debug.WriteLine("The product name is " & sProdName)
    Debug.WriteLine("The available units on hand are " & iUnitQty)
    Debug.WriteLine("The per unit cost is " & dUnitCost)
    					
  6. WriteLine メソッドはまた、既存のオブジェクトの名前空間とクラス名の表示にも利用できます。たとえば、次のコードを入力すると、出力ウィンドウに System.Xml.XmlDocument 名前空間が表示されます。
    Dim oxml As New System.Xml.XmlDocument()
    Debug.WriteLine(oxml)
    					
  7. 出力を整形するため、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, "Field")
    Debug.WriteLine("Total Cost is" & iUnitQty * dUnitCost, "Calc")
    					
  8. Debug クラスの WriteLineIf メソッドを使用すると、指定した条件が True と評価された場合にのみ、メッセージが出力ウィンドウに表示されます。このとき、WriteLineIf メソッドの最初の入力パラメータが、条件として評価されます。WriteLineIf の 2 番目のパラメータには、最初のパラメータの条件が True と評価された場合にのみ表示するメッセージを指定します。
    Debug.WriteLineIf(iUnitQty > 50, "This message WILL appear")
    Debug.WriteLineIf(iUnitQty < 50, "This message will NOT appear")
    					
  9. 指定した条件が False と評価された場合にのみ、出力ウィンドウにメッセージを表示するには、以下のように Debug クラスの Assert メソッドを使用します。
    Debug.Assert(dUnitCost > 1, "Message will NOT appear")
    Debug.Assert(dUnitCost < 1, "Message will appear")
    					
  10. コンソール ウィンドウ (tr1) と Output.txt という名前のテキスト ファイル (tr2) のそれぞれに対応する TextWriterTraceListener オブジェクトを作成し、作成したオブジェクトを Debug Listeners コレクションに追加します。
    Dim tr1 As New TextWriterTraceListener(System.Console.Out)
    Debug.Listeners.Add(tr1)
            
    Dim tr2 As New _
      TextWriterTraceListener(System.IO.File.CreateText("Output.txt"))
    Debug.Listeners.Add(tr2)
    					
  11. 読みやすさを考慮し、Unindent メソッドを使用して、Debug クラスから生成される後続のメッセージの字下げを解除します。Indent メソッドと Unindent メソッドを併用することで出力がグループ分けされ、読みやすくなります。
    Debug.Unindent()
    Debug.WriteLine("Debug Information-Product Ending")
    					
  12. 個々の 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 であることを確認します。Visual Basic 2005 の場合は、ソリューション構成の設定は必要ないため、以下の手順 2. 〜 5. までは不要です。
  2. ソリューション エクスプローラ ウィンドウが表示されていない場合は、Ctrl + Alt + L キーを押して表示します。
  3. [conInfo] を右クリックし、[プロパティ] をクリックします。
  4. [conInfo のプロパティ ページ] の左側のペインで、矢印が [構成プロパティ] フォルダの下の [デバッグ] をポイントしていることを確認します。
  5. [構成プロパティ] フォルダの上にある [構成] ボックスの [アクティブ (Debug)] または [Debug] をクリックし、[OK] をクリックします。
  6. Ctrl + Alt + O キーを押して出力ウィンドウを表示します。
  7. F5 キーを押してコードを実行します。[アサートに失敗しました] ダイアログ ボックスが表示されたら [無視] をクリックします。
  8. コンソール ウィンドウで Enter キーを押します。これによりプログラムが終了し、出力ウィンドウ (Visual Basic 2005 の場合は、イミディエイト ウィンドウ) に次の内容が表示されます。
    Debug Information-Product Starting
        The product name is Widget
        The available units on hand are 100
        The per unit cost is 1.03
        System.Xml.XmlDocument
        Field: The product name is Widget
        Field: The units on hand are 100
        Field: The per unit cost is 1.03
        Calc: Total cost is 103
        This message WILL appear
        ---- デバッグ アサート失敗 ----
    ---- 短いメッセージのアサート ----
    Message will appear
    ---- 長いメッセージのアサート ----
    
        at Module1.Main()  C:\Documents and Settings\Administrator\My
        Documents\Visual Studio Projects\conInfo\Module1.vb(29)
    
        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
    						
  9. コンソール ウィンドウと Output.txt ファイルには、次の内容が出力されます。
    (Output.txt ファイルは、conInfo.exe 実行ファイルと同じディレクトリにあります。
    通常このディレクトリは、プロジェクトのソースが保存されている場所の \bin フォルダです。
    デフォルトでは C:\Documents and Settings\ユーザー ログイン\My Documents
    \Visual Studio Projects\conInfo\bin になります。)
        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
    						

完全なコード リスト

Module Module1
    Sub Main()
        Dim sProdName As String = "Widget"
        Dim iUnitQty As Integer = 100
        Dim dUnitCost As Decimal = 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)
        Debug.WriteLine("The per unit cost is " & dUnitCost)

        Dim oxml As 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, "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")

        Dim tr1 As New TextWriterTraceListener(System.Console.Out)
        Debug.Listeners.Add(tr1)

        Dim tr2 As 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()

    End Sub
End Module
				

トラブルシューティング

  • ソリューション構成の種類が Release の場合、Debug クラスの出力は無視されます。
  • 特定の出力先に対して TextWriterTraceListener クラスを作成した場合、TextWriterTraceListener は Trace および Debug の両方のクラスから出力を受け取ります。Listeners クラスに TextWriterTraceListener を追加する場合、どちらのクラスの Add メソッドを使用しても、この動作に変わりはありません。
  • Trace クラスと Debug クラスで、同じ出力先に対して Listener オブジェクトを追加した場合、どちらのクラスから出力が生成されても、同じ行が 2 回ずつ出力されます。
    Dim tr1 As New TextWriterTraceListener(System.Console.Out)
    Debug.Listeners.Add(tr1)
    Dim tr2 As New TextWriterTraceListener(System.Console.Out)
    Trace.Listeners.Add(tr2)
    					

関連情報

詳細情報については、.NET Framework SDK の、クラス ライブラリの項目にある以下のトピックを参照してください。
Trace クラス
http://msdn.microsoft.com/library/ja/cpref/html/frlrfSystemDiagnosticsTraceClassTopic.asp

Debug クラス
http://msdn.microsoft.com/library/ja/cpref/html/frlrfSystemDiagnosticsDebugClassTopic.asp
トレースに関する詳細については、Microsoft .NET Framework SDK クイック スタート チュートリアルの以下のトピックを参照してください。
タスクの例 : トレースを使用する
http://ja.gotdotnet.com/quickstart/howto/doc/Trace.aspx

タスクの例 : 小さなアプリケーションにトレース機能を装備する
http://ja.gotdotnet.com/quickstart/howto/doc/TraceDemo.aspx

プロパティ

文書番号: 313417 - 最終更新日: 2006年10月3日 - リビジョン: 3.3
この資料は以下の製品について記述したものです。
  • Microsoft Visual Basic 2005
  • Microsoft Visual Basic .NET 2003 Standard Edition
  • Microsoft Visual Basic .NET 2002 Standard Edition
キーワード:?
kbhowtomaster kbbug kbdebug kbvs2002sp1sweep kbvs2005applies kbvs2005swept KB313417
"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