Visual Studio のトレースポイントを使用して出力ウィンドウに情報を記録する

トレースポイントを使用すると、コードの変更や停止を行うことなく、構成可能な条件の下で出力ウィンドウに情報を記録できます。 この機能は、マネージド言語 (C#、Visual Basic、F#) とネイティブ コードの両方と、JavaScript や Python などの言語でサポートされています。

Note

.NET API を使用してプログラムによって [出力] ウィンドウに情報を記録する方法については、「出力ウィンドウにメッセージを送信する」を参照してください。

例を見てみましょう

次のサンプル プログラムは、ループで新しい繰り返しが実行されるたびに 1 ずつ増加するカウンター変数を持つ単純な for ループです。

Screenshot of a sample counter program.

次のサンプル プログラムは、ループで新しい繰り返しが実行されるたびに 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;
            }
        }
    }
}

ソース コードでトレースポイントを設定する

トレースポイントを設定するには、 [ブレークポイント設定] ウィンドウの [アクション] チェックボックスで出力文字列を指定します。

  1. トレースポイントを初期化するには、まずトレースポイントを設定する行番号の左側にある余白をクリックします。

    Screenshot showing the Breakpoint Initialization in the sample code.

  2. 赤い円の上にマウス ポインターを移動し、歯車アイコンをクリックします。

  3. この操作により、[ブレークポイント設定] ウィンドウが開きます。

    Screenshot showing Breakpoint Window.

  4. [アクション] チェックボックスをオンにします。

    Screenshot of breakpoint window with Actions Box checked.

    赤い円がひし形に変わり、ブレークポイントからトレースポイントに切り替えたことを示していることがわかります。

  5. 記録するメッセージを [出力ウィンドウにメッセージを表示します] テキスト ボックスに入力します (詳細については、この記事の後半のセクションを参照してください)。

    これでトレースポイントが設定されました。 出力ウィンドウに情報を記録するだけの場合は、[閉じる] ボタンを押します。

  6. メッセージが表示されるかどうかを決定する条件を追加する場合は、 [条件] チェックボックスを選択します。

    Screenshot of breakpoint window with Conditions Box checked.

    条件には 3 つの選択肢があります。 [条件式][フィルター][ヒット カウント] です。

トレースポイントを設定するには、 [ブレークポイント設定] ウィンドウの [アクション] チェックボックスで出力文字列を指定します。

  1. トレースポイントを初期化するには、まずトレースポイントを設定する行番号の左側にある余白をクリックします。

    Screenshot showing the Breakpoint Initialization in the sample code.

  2. 赤い円の上にマウス ポインターを置き、歯車アイコンをクリックして [ブレークポイントの設定] ウィンドウを開きます。

    Screenshot showing Breakpoint Window.

  3. [アクション] チェックボックスをオンにします。

    Screenshot of breakpoint window with Actions Box checked.

    赤い円がひし形に変わり、ブレークポイントからトレースポイントに切り替えたことを示していることがわかります。

  4. 記録するメッセージを [出力ウィンドウにメッセージを表示します] テキスト ボックスに入力します (詳細については、この記事の後半のセクションを参照してください)。

    これでトレースポイントが設定されました。 出力ウィンドウに情報を記録するだけの場合は、[閉じる] ボタンを押します。

  5. メッセージが表示されるかどうかを決定する条件を追加する場合は、 [条件] チェックボックスを選択します。

    Screenshot of breakpoint window with Conditions Box checked.

    条件には 3 つの選択肢があります。 [条件式][フィルター][ヒット カウント] です。

[アクション] メニュー

このメニューを使用すると、出力ウィンドウにメッセージを記録できます。 出力する文字列をメッセージ ボックスに入力します (引用符は必要ありません)。 変数の値を表示する場合は、中かっこで囲んでください。

たとえば、出力コンソールに counter 変数の値を表示する場合は、メッセージ ボックスに「{counter}」と入力します。

Screenshot showing Counter Output Message.

[閉じる] をクリックしてプログラムをデバッグすると (F5 キー)、出力ウィンドウに次の出力が表示されます。

Screenshot showing Actions Message In Output Window.

特別なキーワードを使用して、より具体的な情報を表示することもできます。 次のようにキーワードは正確に入力してください (各キーワードの前に "$" を使用し、キーワード自体にはすべて大文字を使用します)。

キーワード 表示される内容
$ADDRESS 現在の命令
$CALLER 関数名の呼び出し
$CALLSTACK [呼び出し履歴]
$FUNCTION 現在の関数名
$PID プロセス ID
$PNAME プロセス名
$TID スレッド ID
$TNAME スレッド名
$TICK ティック数 (Windows GetTickCount から)

このメニューを使用すると、出力ウィンドウにメッセージを記録できます。 出力する文字列をメッセージ ボックスに入力します (引用符は必要ありません)。 変数の値を表示する場合は、中かっこで囲んでください。

たとえば、出力コンソールに counter 変数の値を表示する場合は、メッセージ ボックスに「{counter}」と入力します。

Screenshot showing Counter Output Message.

[閉じる] をクリックしてプログラムをデバッグすると (F5 キー)、出力ウィンドウに次の出力が表示されます。

Screenshot showing Actions Message In Output Window.

特別なキーワードを使用して、より具体的な情報を表示することもできます。 次のようにキーワードは正確に入力してください (各キーワードの前に "$" を使用し、キーワード自体にはすべて大文字を使用します)。

キーワード 表示される内容
$ADDRESS 現在の命令
$CALLER 関数名の呼び出し
$CALLSTACK 呼び出し履歴
$FUNCTION 現在の関数名
$PID プロセス ID
$PNAME [処理名]
$TID スレッド ID
$TNAME スレッド名
$TICK ティック数 (Windows GetTickCount から)

[条件] メニュー

[条件] を使用すると、特定のシナリオでのみ表示されるように出力メッセージをフィルター処理できます。 使用できる条件には、主に 3 つの種類があります。

条件式

条件式の場合、特定の条件が満たされた場合にのみ出力メッセージが表示されます。

条件式の場合、特定の条件が true の場合または変更された場合にメッセージを出力するようにトレースポイントを設定できます。 たとえば、for ループの繰り返し中でもカウンターの値のみを表示する場合は、 [true の場合] オプションをオンにして、メッセージ テキスト ボックスに「i%2 == 0」と入力します。

Screenshot showing Conditional Expression Is True.

forループの繰り返しが変更されたときにカウンターの値を出力する場合は、 [変更された場合] オプションをオンにして、メッセージ テキスト ボックスに「i」と入力します。

Screenshot showing when Conditional Expression is Changed.

[変更された場合] オプションの動作は、プログラミング言語によって異なります。

  • ネイティブ コードの場合、デバッガーでは条件の最初の評価が変更と見なされないため、最初の評価ではトレースポイントにヒットしません。
  • マネージド コードの場合、デバッガーでは、[変更された場合] がオンにされた後の最初の評価で、トレースポイントにヒットします。

条件を設定する際に使用できる有効な式の詳細については、デバッガーの式に関するページを参照してください。

条件式の場合、特定の条件が満たされた場合にのみ出力メッセージが表示されます。

条件式の場合、特定の条件が true の場合または変更された場合にメッセージを出力するようにトレースポイントを設定できます。 たとえば、for ループの繰り返し中でもカウンターの値のみを表示する場合は、 [true の場合] オプションをオンにして、メッセージ テキスト ボックスに「i%2 == 0」と入力します。

Screenshot showing Conditional Expression Is True.

forループの繰り返しが変更されたときにカウンターの値を出力する場合は、 [変更された場合] オプションをオンにして、メッセージ テキスト ボックスに「i」と入力します。

Screenshot showing when Conditional Expression is Changed.

[変更された場合] オプションの動作は、プログラミング言語によって異なります。

  • ネイティブ コードの場合、デバッガーでは条件の最初の評価が変更と見なされないため、最初の評価ではトレースポイントにヒットしません。
  • マネージド コードの場合、デバッガーでは、[変更された場合] がオンにされた後の最初の評価で、トレースポイントにヒットします。

コードの特定のセクションにブレークポイントを挿入し、[ブレークポイント設定] メニューのチェックボックス [次のブレークポイントがヒットしたときのみ有効にする] オプションを選択すると、トレースポイントを有効にできる条件を設定することもできます。 選択肢のリストから任意のブレークポイントを選択できます。

Screenshot showing enable when a breakpoint is hit checked.

条件を設定する際に使用できる有効な式の詳細については、デバッガーの式に関するページを参照してください。

ヒット カウント

ヒット カウント条件を使用すると、トレースポイントが設定されているコード行が指定された回数実行された後にのみ、出力を送信できます。

ヒット カウントの場合、トレースポイントが設定されているコード行が特定の回数実行されたときにメッセージを出力することを選択できます。 要件に基づいて、指定したヒット カウント値と等しい、その倍数である、またはその値以上である可能性があります。 ニーズに最適なオプションを選択し、対象の繰り返しを表す整数値 (たとえば、5) をフィールドに入力します。

Screenshot showing Conditional Expression Hit Count.

ヒット カウント条件を使用すると、トレースポイントが設定されているコード行が指定された回数実行された後にのみ、出力を送信できます。

ヒット カウントの場合、トレースポイントが設定されているコード行が特定の回数実行されたときにメッセージを出力することを選択できます。 要件に基づいて、指定したヒット カウント値と等しい、その倍数である、またはその値以上である可能性があります。 ニーズに最適なオプションを選択し、対象の繰り返しを表す整数値 (たとえば、5) をフィールドに入力します。

Screenshot showing Conditional Expression Hit Count.

また、最初のヒット時にブレークポイントを削除するには、チェックボックス [ヒットしたらブレークポイントを削除する] をオンにします。

Screenshot showing Remove breakpoint on first hit.

Assert

フィルター条件について、表示するデバイス、プロセス、またはスレッドの出力を指定します。

Screenshot showing Conditional Expression Filter.

フィルター式の一覧:

  • MachineName = "name"
  • ProcessId = value
  • ProcessName = "name"
  • ThreadId = value
  • ThreadName = "name"

文字列 (名前など) は二重引用符で囲みます。 値は、引用符なしで入力できます。 句は、& (AND)、|| (OR)、! (NOT) を使用して結合できます。

フィルター条件について、表示するデバイス、プロセス、またはスレッドの出力を指定します。

Screenshot showing Conditional Expression Filter.

フィルター式の一覧:

  • MachineName = "name"
  • ProcessId = 値
  • ProcessName = "name"
  • ThreadId = 値
  • ThreadName = "name"

文字列 (名前など) は二重引用符で囲みます。 値は、引用符なしで入力できます。 句は、& (AND)、|| (OR)、! (NOT) を使用して結合できます。

注意事項

トレースポイントは、デバッグをよりクリーンでスムーズなエクスペリエンスにすることを目的としています。 しかし、使用する場合に注意が必要な考慮事項がいくつかあります。

オブジェクトのプロパティまたは属性を検査すると、その値が変わる場合があります。 検査中に値が変化した場合、それはトレースポイント機能自体が原因のバグではありません。 ただし、トレースポイントを使用してオブジェクトを検査しても、このような偶発的な変更は避けられません。

[アクション] メッセージ ボックスで式が評価される方法は、その時点で開発に使用している言語と異なる場合があります。 たとえば、文字列を出力するために、通常は Debug.WriteLine() または console.log() を使用している場合でも、メッセージを引用符で囲む必要はありません。 また、出力式の中かっこ構文 ({ }) は、開発言語で値を出力する場合の規則とは異なることがあります (ただし、中かっこ ({ }) 内の内容は、開発言語の構文を使用して記述する必要があります)。

ライブ アプリケーションをデバッグしていて、同様の機能を探している場合は、スナップショット デバッガーのログポイント機能をご確認ください。 スナップショット デバッガーは、運用アプリケーションの問題を調査するために使用されるツールです。 また、ログポイントを使用すると、ソース コードを変更することなく、また実行中のアプリケーションに影響を与えることなく、出力ウィンドウにメッセージを送信することができます。 詳細については、ライブ Azure アプリケーションのデバッグに関するページを参照してください。