技術まとめ・メモ

Gnu DeBugger

コマンド

括弧は省略可(というか前方一致でかつ一意に定まるなら省略可っぽい?例えば i l は locals, lines があるため一意に定まらないが、 i loi 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) を使ったほうが良いと思う