東京高専プロコンゼミ① Advent Calendar 2022
の8日目の記事です.ほかの記事もぜひご覧ください.
gdb
linux に標準のデバッガ.
入ってない場合debianの場合は以下のコマンドで入る.
$ sudo apt install gdb

上の画像はgdb-pedaというgdbを拡張するスクリプトを入れたもの.
素のgdbはちょっと使いづらいと思うのでこのgdb-pedaのような拡張を使うと良いと思う.
gdb-peda
git clone https://github.com/longld/peda.git ~/peda
echo "source ~/peda/peda.py" >> ~/.gdbinit
セットアップは以上のコマンドを実行するだけで良い.
またCopyrightが邪魔な場合はgdb -qで起動すると表示されない.なのでこのaliasを張ると良い.
echo 'alias gdb="gdb -q"' >> ~/.bashrc
echo 'alias gdb="gdb -q"' >> ~/.zshrc
いろいろ説明を書きますが、以下のページを見ればだいたいわかります.
デバッグ用にコンパイル
$ gcc -g -o <output> <intput.c>
-gをつけてコンパイルするとデバッグ用の情報を含めてくれるのでデバッグ時にいろいろ便利.
(つけなくてもデバッグできる)
起動
$ gdb <実行形式ファイル>
break
breakまたはbで break pointを設定できる.
mainにbreak point を張る例
b main
b *0x555555555140
run
実行するにはrunまたはrを入力.
run
peda実行した結果.ブレークポイントを仕掛けていた場合そこで停止する.

pedaを入れている場合上から
- レジスタの状態.
- 今実行している命令.
- スタックの状態.
- 対応するプログラム行(
-g付きでコンパイルした場合)
が表示される.
x (メモリの確認
xで指定したアドレスから指定した分だけ表示することができる.
下は10個のi(instruction)を0x555555555139から表示する例.
x /10i 0x555555555139
xで表示できる形式は以下のページを参照.
reg (レジスタの表示
レジスタファイルの状態を表示.
reg
xinfo register
指定したレジスタの値を見る.
xinfo register <register>
set (メモリ,レジスタ書き換え
メモリやレジスタの書き換えができる.
下のは0x555555555139に1をエンディアンに従い書きこむ例.
set *0x555555555139=1
以下はraxに0を書き込む例
set $rax=0x1623475869
c
continue.プログラムの再開.
c
n
next
命令を一つ進める.
n
s
step
命令を一つ進める.サブルーチンの中に入る.(call命令で呼ばれている関数の中に入る.nは入らない.
s
q (終了
gdbを終了
q
直前のコマンドと同じコマンド
何も入力せずEnterキーを押すことで直前に実行したコマンドをもう一度実行できる.
stepとかnextでプログラムを進めたいときに便利.
おわりに
間違いがあったら教えてください.
東京高専プロコンゼミ① Advent Calendar 2022
の8日目の記事です.ほかの記事もぜひご覧ください.







