Visual Studioでトレースポイントを作成する場合(ブレークポイントを右クリックして[ヒットした場合...]を選択)、ダイアログには次のテキストが表示されます。
中括弧で囲むことにより、変数または他の式の値をメッセージに含めることができます。
どのような表現が許可されていますか?
Visual Studioでトレースポイントを作成する場合(ブレークポイントを右クリックして[ヒットした場合...]を選択)、ダイアログには次のテキストが表示されます。
中括弧で囲むことにより、変数または他の式の値をメッセージに含めることができます。
どのような表現が許可されていますか?
Microsoftのドキュメントは、許可されているものと許可されていないものの正確な詳細についてはかなりまばらです。以下のほとんどは、イミディエイトウィンドウでの試行錯誤によって見つかりました。このリストはC++用であることに注意してください。これは、私がコーディングしたものです。C#を信じているので、以下の禁止されている項目のいくつかは実際に許可されています。
キャスト、変数の設定、関数の呼び出しなど、ほとんどの基本的な式を評価できます。
一般的な制限{ *(bool*)(0x1234) = true }
{ @eip = 0x1234 }
トレースポイントから関数を呼び出すことは非常に強力です。慎重に設定された関数と適切な呼び出しにより、上記の制限のほとんどを回避できます。ここにいくつかのより具体的なアイデアがあります。
ifを強制する非常に簡単です。トレースポイントを設定して変数を設定し、テストする必要があるものに応じて、if条件をtrueまたはfalseに強制します。コードを追加したり、デバッグセッションを終了したりすることなくすべて。
ブレークポイントの「切り替え」「頻繁にヒットする場所でブレークする必要があります。別のブレークポイントからそのブレークポイントを有効にしたいので、気になるものは特定のコードからのブレークのみを取得します。パス。どうすればそれができますか?」上記の知識があれば、ヘルパー変数は必要ですが、簡単です。
良い点は、デバッグセッションを終了せずにトレースポイントを移動できることです。再度実行する必要がある場合は、イミディエイトウィンドウまたはウォッチウィンドウを使用してグローバルフラグをリセットします。完了したら、クリーンアップする必要があるのはそのグローバルブール値だけです。削除する他のコードはありません。
コードを自動的にスキップするEIPレジスタ(少なくともx86では)は命令ポインタです。割り当てると、プログラムフローを変更できます。
{@eip = address}
これは便利ですが、このようなコードをスキップすると奇妙な動作を引き起こす可能性があるため、注意してください。
Kurt Hutchinsonが言うように、文字列の割り当てはトレースポイントでは許可されていません。これを回避するには、文字列変数を割り当てるメソッドを作成し、それを呼び出します。
public static class Helper
{
public static void AssignTo(this string value, out string variable)
{
variable = value;
}
}
次に、トレースポイントメッセージで:
{"new string value".AssignTo(out stringVariable)}