GDB 使い方備忘録

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

基本

$ gdb {プログラム名}

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

break {ラベル名}
run

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

set disassembly-flavor intel

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

layout asm
layout regs

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

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

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

一時停止・再開

ブレークポイント

break 位置

次のブレークポイントまで実行

continue

一覧表示・削除

ブレークポイントの番号はinfoコマンドで得ることができる.

info breakpoints
delete breakpoints 番号

変数検査

自動表示

自動表示コマンドdisplayを使うことで,プログラムが停止するたびに変数の内容などを表示することができます.

display 変数・式

一覧表示・削除はブレークポイントと同様です.

info display
delete display 番号

メモリ検査

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

参考文献