GDB のユーザー定義コマンドで VM の状態を知る - JIT 実装中
JIT 実装中に VM の仮想レジスタの内容やスタックを覗きたい事がある。
GDB のユーザー定義コマンドを利用して以下のように定義した。
## stack top is "sp 1" define sp printf "%d\n", ((intptr_t*)(*(((intptr_t*)$rdi) + 5)))[-$arg0] end define hook-stop printf "============ State ============= \n" printf " [%d]\n", $r8 printf " ac=0x%08x pc=0x%08x\n", *(((intptr_t*)$rdi) + 1), *(((intptr_t*)$rdi) + 6) printf " sp=0x%08x fp=0x%08x\n", *(((intptr_t*)$rdi) + 5), *(((intptr_t*)$rdi) + 4) end
hook-stop は、プログラムが停止したときに自動で呼ばれる。
以下は使用例。
(gdb) c Continuing. Program received signal SIGTRAP, Trace/breakpoint trap. ============ State ============= [4009] ac=0x00000009 pc=0x0271a068 sp=0x00c7c188 fp=0x00c7c150 0x0000000000b8d038 in ?? () (gdb) sp 2 1