今までgdbを騙し騙し使ってきたが一度全体的に学びたかったのでドキュメントを読んだ。

↓以下は自分用のメモ

(gdb) shell ls のようにすると gdb からシェルコマンドを叩ける

条件付き break point

関数の引数に対する break であれば以下のようにできる。引数じゃない場合は、break で行数を指定するしかない。

break foo if x>0
commands
  silent
  printf "x is %d\n",x
cont
end

スレッド番号を指定しながらの break

break linespec thread threadno if ...

1マシン命令の実行

  • stepi
  • nexti

スタック・フレーム

呼び出しスタックは、 スタック・フレーム、 または短縮してフレームと呼ばれる、 連続した小部分に分割される。bt でバックトレースを表示した時の左の番号がフレーム番号。

(gdb) bt
#0  pthread_cond_timedwait@@GLIBC_2.3.2 () at ../nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S:238
#1  0x00007f023ab610ef in native_cond_timedwait (ts=<optimized out>, mutex=<optimized out>, cond=<optimized out>) at thread_pthread.c:361
#2  native_sleep (th=0x7f023c8075d0, timeout_tv=0x7ffe8eb70490) at thread_pthread.c:1149
#3  0x00007f023ab6171b in sleep_timeval (th=0x7f023c8075d0, tv=..., spurious_check=1) at thread.c:1134
#4  0x00007f023ab65405 in rb_thread_wait_for (time=...) at thread.c:1202
#5  0x00007f023aad3f60 in rb_f_sleep (argc=1, argv=0x7f023a90b090) at process.c:4397
#6  0x00007f023ab9a0a1 in vm_call_cfunc_with_frame (ci=0x7f023cb782b0, cc=<optimized out>, calling=<optimized out>, reg_cfp=0x7f023aa0af50, th=0x7f023c8075d0) at vm_insnhelper.c:1752
#7  vm_call_cfunc (th=0x7f023c8075d0, reg_cfp=0x7f023aa0af50, calling=<optimized out>, ci=0x7f023cb782b0, cc=<optimized out>) at vm_insnhelper.c:1847
#8  0x00007f023aba1dc1 in vm_exec_core (th=th@entry=0x7f023c8075d0, initial=initial@entry=0) at insns.def:1066
#9  0x00007f023aba6057 in vm_exec (th=th@entry=0x7f023c8075d0) at vm.c:1727
(gdb) fame 8
(gdb) up
(gdb) down

info line 関数 で関数の最初の行に対応するオブジェクト・コードの位置を知ることができる

(gdb) info line m4_changecom
Line 895 of "builtin.c" starts at pc 0x634c and ends at 0x6350.