技術まとめ・メモ
Gnu DeBugger
コマンド
括弧は省略可(というか前方一致でかつ一意に定まるなら省略可っぽい?例えば i l は locals, lines があるため一意に定まらないが、 i lo や i li ならOK)
-
help COMMAND → 最強
-
b(reak) PROBE_MODIFIER → アドレスやシンボルにbreakpointを張る
-
wa(tch) EXPR → EXPR にwatchpointを張る(EXPRが変わったら止まる?)
-
d(elete) BREAKPOINT_NUM → breakpoint or watchpointを削除
i bでbreakpointの番号を確認してからやると良い -
i(nfo) {r(egisters), b(reakpoints) lo(cals), …} → 多すぎるので
help infoしたほうが良い -
s(tep), s(tep)i → step-in sはソースコードレベルで1行進み、siは機械語の命令レベルで1つ進む
-
n(ext), n(ext)i → step-over、callで関数に飛ばない
-
c(ontiniue) → 再度breakpointに引っかかるまで実行
-
x(/fmt) ADDR → ADDR にある値を fmt でフォーマットして出力
/fmt部分は n (repeat count), f (format), u (unit size) で指定する- fは x (hex), d (signed decimal), u (unsigned decimal), o (octal), t (twoなので2進数), a (address), c (ascii char), f (float), s (string), z (0-padded hex), r (raw) がある
- u は b (byte), h (half word 2byte), w (word 4byte), g (giant word == 8byte) がある
- ex) x/8ubfx 0xff → count=8, unit=byte, format=x、つまりアドレス 0xff から1バイト単位で8個分、16進数で値を出力
-
p(rint) EXPR → exprを評価して出力
- Data (Debugging with GDB)
- expr :例えば rax など、またローカル変数に int a があるとき、 &a とすればaのアドレスになったりするし、
*0xf0のようにアドレスをデリファレンスすることもできる
-
wha(t) EXPR → expr の型を表示
-
backtrace|bt → 名前の通り
TUI mode
Ctrl+X Ctrl+A でTUI modeをtogglできる
layout (src|asm|regs)というコマンドで、ソースコード・現在実行している命令・レジスタ一覧を表示することができる- 異なる
layoutコマンドを2回実行することで同時に並べて表示することができるが、asm と src は同時に表示できないらしい?
- 異なる
- フォーカス中のエリアは上下キーでスクロールできる
- コマンド履歴が選べなくなってダルかったりする
- 複数表示されていたら Ctrl+X o でフォーカスを切り替え
- あと Ctrl+X (1|2) で表示を切り替えられる
これより [gdb-dashboard]https://github.com/cyrus-and/gdb-dashboard) を使ったほうが良いと思う