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