実行中に独自のコードを変更するプログラムがあります。コードにブレークポイントを設定しようとすると、コードを変更するとブレークポイントが何らかの形で削除されるため、ブレークポイントが壊れることはありません。
ハードウェアブレークポイントについて聞いたことがありますが、ハードウェアでサポートされていないことがgdbに記述されています。自己修正コードに割り込む他の方法はありますか?
実行中に独自のコードを変更するプログラムがあります。コードにブレークポイントを設定しようとすると、コードを変更するとブレークポイントが何らかの形で削除されるため、ブレークポイントが壊れることはありません。
ハードウェアブレークポイントについて聞いたことがありますが、ハードウェアでサポートされていないことがgdbに記述されています。自己修正コードに割り込む他の方法はありますか?
GDB がブレークポイントを配置する方法は 2 つあります。1 つは、特定の特殊レジスターを設定して、その行が実行されたときに CPU にブレーク (割り込みを発生させ、カーネルがデバッガーへのシグナルに変換) するように指示することです。これらは、GDB が「ハードウェア ブレーク ポイント」と呼ぶものです。ハードウェアでサポートされていない場合は、サポートされていません。
もう 1 つの方法は、実際にコードを変更し、ブレークする行の最初の命令を、割り込みを発生させるコマンドに置き換えることです。たとえば、Intel X86 では、"int 5" などの割り込みを発生させるコマンドの長さは 2 バイトですが、割り込み 3 を発生させるコマンドの長さは 1 バイトしかありません。これは、まさにこの目的に使用できるようにするためです。
デバッガーは命令をブレークポイントに置き換え、ブレークポイントに到達すると、そのコードをデバッガーが干渉する前のコードに置き換えます。はい、この手法は自己変更コードでは機能しません (また、フラッシュへの書き込みなど、読み取り専用メモリ内のコードでも機能しません)。
コードが十分に整然としている場合 (そして明らかに、特に整然としていない場合)、コードがメモリに書き込まれた直後に 1 回ブレークし、それから正しい場所に 2 つ目のブレーク ポイントを配置することができます。GDB のスクリプト作成機能を十分に研究すれば、それを自動化することもできるので、最初のブレーク ポイントに煩わされることはありません。
全体として、自己変更コードを作成している場合は、踏まれた道から外れています。幸運を。あなたはそれを必要とするでしょう。
シャチャー