ブレークポイントの設定時に伴うリスク
メモリ アドレスまたはシンボルとオフセットを指定してブレークポイントを設定する場合、このブレークポイントを命令の途中に配置しないでください。
たとえば、次の逆アセンブルされたコードを考えてみましょう。
770000f1 5e pop esi
770000f2 5b pop ebx
770000f3 c9 leave
770000f4 c21000 ret 0x10
770000f7 837ddc00 cmp dword ptr [ebp-0x24],0x0
最初の 3 つの命令の長さはわずか 1 バイトです。 ただし、4 番目の命令の長さは 3 バイトです。 (バイト 0x770000F4、0x770000F5、および 0x770000F6 が含まれます。)bp, bu, または ba コマンドを使用してこの命令にブレークポイントを設定する場合は、0x770000F4 アドレスを指定する必要があります。
ba コマンドを使用して 0x770000F5 アドレスにブレークポイントを設定すると、プロセッサはその位置にブレークポイントを設定します。 ただし、プロセッサは 0x770000F4 を命令の実際のアドレスと見なすため、このブレークポイントはトリガーされません。
bp または bu コマンドを使用して 0x770000F5 アドレスにブレークポイントを設定すると、デバッガーはその場所にブレークポイントを書き込みます。 ただし、デバッガーがブレークポイントを作成する方法が原因で、このブレークポイントはターゲットを破損する可能性があります。
デバッガは 0x770000F5 の内容を保存し、このメモリをブレークポイント命令で上書きします。
デバッガでこのメモリを表示しようとしても、デバッガは書き込んだブレークポイント命令を表示しません。 代わりに、デバッガーはそこに「あるべき」メモリを表示します。 つまり、デバッガーには、元のメモリ、またはブレークポイントの挿入後にそのメモリに加えられた変更が表示されます。
BC コマンドを使用してブレークポイントを削除すると、デバッガは元のメモリを適切な場所に復元します。
0x770000F5 にブレークポイントを設定すると、デバッガーはこのバイトを保存し、ブレーク命令がここに書き込まれます。 ただし、アプリケーションが実行されると、0x770000F4 アドレスに到達し、このアドレスがマルチバイト命令の最初のバイトとして認識されます。 次に、プロセッサは 0x770000F4、0x770000F5、および場合によってはそれ以降のバイトを 1 つの命令に結合しようとします。 この組み合わせによりさまざまな動作が発生する可能性がありますが、どれも望ましいものではありません。
したがって、bp, bu, または ba コマンドを使用してブレークポイントを設定する場合は、常に適切なアドレスにブレークポイントを設定するようにしてください。 WinDbg グラフィカル インターフェイスを使用してブレークポイントを追加している場合は、正しいアドレスが自動的に選択されるため、この状況を心配する必要はありません。
あいまいなブレークポイントの解決
デバッガ エンジンのバージョン 10.0.25310.1001 以降では、あいまいなブレークポイント解決がサポートされるようになりました。 あいまいなブレークポイントにより、ブレークポイント式が複数の場所に解決される特定のシナリオで、デバッガーがブレークポイントを設定できます。 詳細については、「あいまいなブレークポイントの解決」を参照してください。