Visual Studio のトレースポイントを使用して出力ウィンドウに情報を記録する
トレースポイントを使用すると、コードの変更や停止を行うことなく、構成可能な条件の下で出力ウィンドウに情報を記録できます。 この機能は、マネージド言語 (C#、Visual Basic、F#) とネイティブ コードの両方と、JavaScript や Python などの言語でサポートされています。
Note
.NET API を使用してプログラムによって [出力] ウィンドウに情報を記録する方法については、「出力ウィンドウにメッセージを送信する」を参照してください。
例を見てみましょう
次のサンプル プログラムは、ループで新しい繰り返しが実行されるたびに 1 ずつ増加するカウンター変数を持つ単純な for
ループです。
次のサンプル プログラムは、ループで新しい繰り返しが実行されるたびに 1 ずつ増加するカウンター変数を持つ単純な for
ループです。
using System.Diagnostics;
namespace Tracepoints
{
public class Program
{
public static void Main(string[] args)
{
int counter = 0;
for (int i=0; i<=10; i++)
{
counter +=1;
}
}
}
}
ソース コードでトレースポイントを設定する
トレースポイントを設定するには、 [ブレークポイント設定] ウィンドウの [アクション] チェックボックスで出力文字列を指定します。
トレースポイントを初期化するには、まずトレースポイントを設定する行番号の左側にある余白をクリックします。
赤い円の上にマウス ポインターを移動し、歯車アイコンをクリックします。
この操作により、[ブレークポイント設定] ウィンドウが開きます。
[アクション] チェックボックスをオンにします。
赤い円がひし形に変わり、ブレークポイントからトレースポイントに切り替えたことを示していることがわかります。
記録するメッセージを [出力ウィンドウにメッセージを表示します] テキスト ボックスに入力します (詳細については、この記事の後半のセクションを参照してください)。
これでトレースポイントが設定されました。 出力ウィンドウに情報を記録するだけの場合は、[閉じる] ボタンを押します。
メッセージが表示されるかどうかを決定する条件を追加する場合は、 [条件] チェックボックスを選択します。
条件には 3 つの選択肢があります。 [条件式] 、 [フィルター] 、 [ヒット カウント] です。
トレースポイントを設定するには、 [ブレークポイント設定] ウィンドウの [アクション] チェックボックスで出力文字列を指定します。
トレースポイントを初期化するには、まずトレースポイントを設定する行番号の左側にある余白をクリックします。
赤い円の上にマウス ポインターを置き、歯車アイコンをクリックして [ブレークポイントの設定] ウィンドウを開きます。
[アクション] チェックボックスをオンにします。
赤い円がひし形に変わり、ブレークポイントからトレースポイントに切り替えたことを示していることがわかります。
記録するメッセージを [出力ウィンドウにメッセージを表示します] テキスト ボックスに入力します (詳細については、この記事の後半のセクションを参照してください)。
これでトレースポイントが設定されました。 出力ウィンドウに情報を記録するだけの場合は、[閉じる] ボタンを押します。
メッセージが表示されるかどうかを決定する条件を追加する場合は、 [条件] チェックボックスを選択します。
条件には 3 つの選択肢があります。 [条件式] 、 [フィルター] 、 [ヒット カウント] です。
[アクション] メニュー
このメニューを使用すると、出力ウィンドウにメッセージを記録できます。 出力する文字列をメッセージ ボックスに入力します (引用符は必要ありません)。 変数の値を表示する場合は、中かっこで囲んでください。
たとえば、出力コンソールに counter
変数の値を表示する場合は、メッセージ ボックスに「{counter}」と入力します。
[閉じる] をクリックしてプログラムをデバッグすると (F5 キー)、出力ウィンドウに次の出力が表示されます。
特別なキーワードを使用して、より具体的な情報を表示することもできます。 次のようにキーワードは正確に入力してください (各キーワードの前に "$" を使用し、キーワード自体にはすべて大文字を使用します)。
キーワード | 表示される内容 |
---|---|
$ADDRESS | 現在の命令 |
$CALLER | 関数名の呼び出し |
$CALLSTACK | [呼び出し履歴] |
$FUNCTION | 現在の関数名 |
$PID | プロセス ID |
$PNAME | プロセス名 |
$TID | スレッド ID |
$TNAME | スレッド名 |
$TICK | ティック数 (Windows GetTickCount から) |
このメニューを使用すると、出力ウィンドウにメッセージを記録できます。 出力する文字列をメッセージ ボックスに入力します (引用符は必要ありません)。 変数の値を表示する場合は、中かっこで囲んでください。
たとえば、出力コンソールに counter
変数の値を表示する場合は、メッセージ ボックスに「{counter}
」と入力します。
[閉じる] をクリックしてプログラムをデバッグすると (F5 キー)、出力ウィンドウに次の出力が表示されます。
特別なキーワードを使用して、より具体的な情報を表示することもできます。 次のようにキーワードは正確に入力してください (各キーワードの前に "$" を使用し、キーワード自体にはすべて大文字を使用します)。
キーワード | 表示される内容 |
---|---|
$ADDRESS |
現在の命令 |
$CALLER |
関数名の呼び出し |
$CALLSTACK |
呼び出し履歴 |
$FUNCTION |
現在の関数名 |
$PID |
プロセス ID |
$PNAME |
[処理名] |
$TID |
スレッド ID |
$TNAME |
スレッド名 |
$TICK |
ティック数 (Windows GetTickCount から) |
[条件] メニュー
[条件] を使用すると、特定のシナリオでのみ表示されるように出力メッセージをフィルター処理できます。 使用できる条件には、主に 3 つの種類があります。
条件式
条件式の場合、特定の条件が満たされた場合にのみ出力メッセージが表示されます。
条件式の場合、特定の条件が true の場合または変更された場合にメッセージを出力するようにトレースポイントを設定できます。 たとえば、for
ループの繰り返し中でもカウンターの値のみを表示する場合は、 [true の場合] オプションをオンにして、メッセージ テキスト ボックスに「i%2 == 0
」と入力します。
for
ループの繰り返しが変更されたときにカウンターの値を出力する場合は、 [変更された場合] オプションをオンにして、メッセージ テキスト ボックスに「i
」と入力します。
[変更された場合] オプションの動作は、プログラミング言語によって異なります。
- ネイティブ コードの場合、デバッガーでは条件の最初の評価が変更と見なされないため、最初の評価ではトレースポイントにヒットしません。
- マネージド コードの場合、デバッガーでは、[変更された場合] がオンにされた後の最初の評価で、トレースポイントにヒットします。
条件を設定する際に使用できる有効な式の詳細については、デバッガーの式に関するページを参照してください。
条件式の場合、特定の条件が満たされた場合にのみ出力メッセージが表示されます。
条件式の場合、特定の条件が true の場合または変更された場合にメッセージを出力するようにトレースポイントを設定できます。 たとえば、for
ループの繰り返し中でもカウンターの値のみを表示する場合は、 [true の場合] オプションをオンにして、メッセージ テキスト ボックスに「i%2 == 0
」と入力します。
for
ループの繰り返しが変更されたときにカウンターの値を出力する場合は、 [変更された場合] オプションをオンにして、メッセージ テキスト ボックスに「i
」と入力します。
[変更された場合] オプションの動作は、プログラミング言語によって異なります。
- ネイティブ コードの場合、デバッガーでは条件の最初の評価が変更と見なされないため、最初の評価ではトレースポイントにヒットしません。
- マネージド コードの場合、デバッガーでは、[変更された場合] がオンにされた後の最初の評価で、トレースポイントにヒットします。
コードの特定のセクションにブレークポイントを挿入し、[ブレークポイント設定] メニューのチェックボックス [次のブレークポイントがヒットしたときのみ有効にする] オプションを選択すると、トレースポイントを有効にできる条件を設定することもできます。 選択肢のリストから任意のブレークポイントを選択できます。
条件を設定する際に使用できる有効な式の詳細については、デバッガーの式に関するページを参照してください。
ヒット カウント
ヒット カウント条件を使用すると、トレースポイントが設定されているコード行が指定された回数実行された後にのみ、出力を送信できます。
ヒット カウントの場合、トレースポイントが設定されているコード行が特定の回数実行されたときにメッセージを出力することを選択できます。 要件に基づいて、指定したヒット カウント値と等しい、その倍数である、またはその値以上である可能性があります。 ニーズに最適なオプションを選択し、対象の繰り返しを表す整数値 (たとえば、5) をフィールドに入力します。
ヒット カウント条件を使用すると、トレースポイントが設定されているコード行が指定された回数実行された後にのみ、出力を送信できます。
ヒット カウントの場合、トレースポイントが設定されているコード行が特定の回数実行されたときにメッセージを出力することを選択できます。 要件に基づいて、指定したヒット カウント値と等しい、その倍数である、またはその値以上である可能性があります。 ニーズに最適なオプションを選択し、対象の繰り返しを表す整数値 (たとえば、5) をフィールドに入力します。
また、最初のヒット時にブレークポイントを削除するには、チェックボックス [ヒットしたらブレークポイントを削除する] をオンにします。
Assert
フィルター条件について、表示するデバイス、プロセス、またはスレッドの出力を指定します。
フィルター式の一覧:
- MachineName = "name"
- ProcessId = value
- ProcessName = "name"
- ThreadId = value
- ThreadName = "name"
文字列 (名前など) は二重引用符で囲みます。 値は、引用符なしで入力できます。 句は、&
(AND
)、||
(OR
)、!
(NOT
) を使用して結合できます。
フィルター条件について、表示するデバイス、プロセス、またはスレッドの出力を指定します。
フィルター式の一覧:
MachineName
= "name"ProcessId
= 値ProcessName
= "name"ThreadId
= 値ThreadName
= "name"
文字列 (名前など) は二重引用符で囲みます。 値は、引用符なしで入力できます。 句は、&
(AND
)、||
(OR
)、!
(NOT
) を使用して結合できます。
注意事項
トレースポイントは、デバッグをよりクリーンでスムーズなエクスペリエンスにすることを目的としています。 しかし、使用する場合に注意が必要な考慮事項がいくつかあります。
オブジェクトのプロパティまたは属性を検査すると、その値が変わる場合があります。 検査中に値が変化した場合、それはトレースポイント機能自体が原因のバグではありません。 ただし、トレースポイントを使用してオブジェクトを検査しても、このような偶発的な変更は避けられません。
[アクション] メッセージ ボックスで式が評価される方法は、その時点で開発に使用している言語と異なる場合があります。 たとえば、文字列を出力するために、通常は Debug.WriteLine()
または console.log()
を使用している場合でも、メッセージを引用符で囲む必要はありません。 また、出力式の中かっこ構文 ({ }
) は、開発言語で値を出力する場合の規則とは異なることがあります (ただし、中かっこ ({ }
) 内の内容は、開発言語の構文を使用して記述する必要があります)。
ライブ アプリケーションをデバッグしていて、同様の機能を探している場合は、スナップショット デバッガーのログポイント機能をご確認ください。 スナップショット デバッガーは、運用アプリケーションの問題を調査するために使用されるツールです。 また、ログポイントを使用すると、ソース コードを変更することなく、また実行中のアプリケーションに影響を与えることなく、出力ウィンドウにメッセージを送信することができます。 詳細については、ライブ Azure アプリケーションのデバッグに関するページを参照してください。