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
するリスナー コレクション。
デバッグ クラスを使用してサンプルを作成する
Visual Studio または Visual C# Express Edition を起動します。
conInfo という名前の新しい Visual C# コンソール アプリケーション プロジェクトを作成します。 Class1 は Visual Studio .NET で作成されます。 Program.csは、Visual Studio 2005 で作成されます。
Class1 または Program.cs の最上位に次の名前空間を追加します。
using System.Diagnostics;
製品に関する情報を含むように変数を初期化するには、Main メソッドに次の宣言ステートメントを追加します。
string sProdName = "Widget"; int iUnitQty = 100; double dUnitCost = 1.03;
クラスが生成するメッセージを、 メソッドの最初の
WriteLine
入力パラメーターとして指定します。 Ctrl + Alt + O キーの組み合わせを押して、[出力] ウィンドウが表示されていることを確認します。Debug.WriteLine("Debug Information-Product Starting ");
読みやすくするために、 メソッドを
Indent
使用して、出力ウィンドウで後続のメッセージをインデントします。Debug.Indent();
選択した変数の内容を表示するには、次のように メソッドを
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());
メソッドを
WriteLine
使用して、存在するオブジェクトの名前空間とクラス名を表示することもできます。 たとえば、次のコードは、[出力] ウィンドウに名前空間を表示System.Xml.XmlDocument
します。System.Xml.XmlDocument oxml = new System.Xml.XmlDocument(); Debug.WriteLine(oxml);
出力を整理するには、 メソッドの省略可能な 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");
[出力] ウィンドウでは、 クラスの メソッドを使用
WriteLineIf
して、指定された条件が true と評価された場合にのみメッセージをDebug
表示できます。 評価される条件は、 メソッドの最初のWriteLineIf
入力パラメーターです。 の 2 番目のWriteLineIf
パラメーターは、最初のパラメーターの条件が true と評価された場合にのみ表示されるメッセージです。Debug.WriteLineIf(iUnitQty > 50, "This message WILL appear"); Debug.WriteLineIf(iUnitQty < 50, "This message will NOT appear");
クラスの Assert メソッドを
Debug
使用して、指定した条件が false と評価された場合にのみ [出力] ウィンドウにメッセージが表示されるようにします。Debug.Assert(dUnitCost > 1, "Message will NOT appear"); Debug.Assert(dUnitCost < 1, "Message will appear since dUnitcost < 1 is false");
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);
読みやすくするには、 メソッドを
Unindent
使用して、クラスが生成する後続のメッセージのインデントをDebug
削除します。 メソッドと メソッドを一緒にUnindent
使用Indent
すると、リーダーは出力をグループとして区別できます。Debug.Unindent(); Debug.WriteLine("Debug Information-Product Ending");
各
Listener
オブジェクトがそのすべての出力を確実に受け取るようにするには、クラス バッファーの Flush メソッドをDebug
呼び出します。Debug.Flush();
トレース クラスの使用
クラスを Trace
使用して、アプリケーションの実行を監視するメッセージを生成することもできます。 クラスと Debug
クラスはTrace
、次のような同じメソッドの大部分を共有して出力を生成します。
- WriteLine
- WriteLineIf
- Indent
- Unindent
- アサート
- フラッシュ
クラスと クラスはTrace
Debug
、個別に使用することも、同じアプリケーションでまとめて使用することもできます。 デバッグ ソリューション構成プロジェクトでは、出力と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();
動作することを確認する
[デバッグ] が現在のソリューション構成であることを確認します。
ソリューション エクスプローラー ウィンドウが表示されない場合は、Ctrl + Alt + L キーの組み合わせを押して、このウィンドウを表示します。
conInfo を右クリックし、[プロパティ] をクリックします。
conInfo プロパティ ページの左側のウィンドウの [構成] フォルダーで、矢印が [デバッグ] をポイントしていることを確認します。
注:
Visual C# 2005 および Visual C# 2005 Express Edition で、conInfo ページで [デバッグ] をクリックします。
[構成] フォルダーの上にある [構成] ドロップダウン リスト ボックスで、[アクティブ (デバッグ)] または [デバッグ] をクリックし、[OK] をクリックします。 Visual C# 2005 および Visual C# 2005 Express Edition で、[デバッグ] ページの [構成] ドロップダウン リスト ボックスで [アクティブ (デバッグ)] または [デバッグ] をクリックし、[ファイル] メニューの [保存] をクリックします。
Ctrl キーを押しながら Alt キーを押しながら O キーを押して、[出力] ウィンドウを表示します。
F5 キーを押してコードを実行します。 [ アサーションに失敗しました ] ダイアログ ボックスが表示されたら、[ 無視] をクリックします。
[コンソール] ウィンドウで、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
コンソール ウィンドウと 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
するかどうかに関係なく発生しますListeners
。Trace
クラスと クラスで
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);
関連情報
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示