GDB 使い方備忘録

最近、低レイヤを知りたい人のためのCコンパイラ作成入門を写経しています。 模範コードが常にあるわけではないので当然バグらせまくっているわけですが、アセンブリを出力するこの手のプログラムはなかなかデバッグが難しいです。 そこで重い腰をあげてGDBに挑戦してみたので備忘録です。

基本

$ gdb {プログラム名}

で起動。ブレークポイントを設定後、実行します。

break {ラベル名}
run

AT&T記法が見づらい場合はIntel構文に変更。gdbinitに書いておいてもいいですね。

set disassembly-flavor intel

逆アセンブルしたコードの表示と現在のレジスタ情報を出す。

layout asm
layout regs

そして、現在の地点からステップ実行します。

コマンド略記効果
nextn次の行まで実行(関数呼び出しなら関数全体を実行)
nextini次の機械語を実行(関数呼び出しなら関数全体を実行)
steps次の行まで実行(関数呼び出しなら関数の中に入る)
stepisi次の機械語を実行(関数呼び出しなら関数の中に入る)

コマンド入力画面でそのままENTERを押すと直前のコマンドを再度実行してくれるため、ステップ実行時などに便利です。

メモリ検査

xコマンドを使います(examineの略らしい)。

構文

x /nfu addr

表示フォーマット

フォーマット文字出力内容
xデフォルト値16進数
d10進数
u10進数(符号なし)
o8進数
t2進数(twoの頭文字らしい)
aアドレスとしての表示

他にもあるので、Output Formats (Debugging with GDB)も合わせてご覧ください。

メモリサイズ

メモリサイズ文字サイズ
b (byte)1 Byte
h (halfwords)2 Byte
w (words) ・ デフォルト値4 Byte
g (giant words)8 Byte

スタック表示

スタックの上位10ワードを表示します。$spはスタックポインタ。

x /10 $sp

参考文献