東京高専プロコンゼミ① 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日目の記事です.ほかの記事もぜひご覧ください.