LoginSignup
2
0

gdbデバッガを使う

Last updated at Posted at 2022-12-08

東京高専プロコンゼミ① Advent Calendar 2022
の8日目の記事です.ほかの記事もぜひご覧ください.

gdb

linux に標準のデバッガ.
入ってない場合debianの場合は以下のコマンドで入る.

$ sudo apt install gdb

image.png
上の画像は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を張ると良いでしょう.

bashを使っている場合
echo 'alias gdb="gdb -q"' >> ~/.bashrc 
zshを使っている場合
echo 'alias gdb="gdb -q"' >> ~/.zshrc 

image.png

今からいろいろ説明しますが以下のページを見ればだいたいわかります.

デバッグ用にコンパイル

デバッグ用にコンパイル
$ gcc -g -o <output> <intput.c>

-gをつけてコンパイルするとデバッグ用の情報を含めてくれるのでデバッグ時にいろいろ便利.
(つけなくても,デバッグできる.)

起動

起動
$ gdb <実行形式ファイル>

break

mainにbreak point を張る例breakとかbでも行ける.

シンボルでbreak
b main

image.png

アドレスでbreak
b *0x555555555140

image.png

run

実行するにはrunまたはrを入力.

gdb
run

peda実行した結果.ブレークポイントを仕掛けていた場合そこで停止する.
image.png

pedaを入れている場合上から

  • レジスタの状態.
  • 今実行している命令.
  • スタックの状態.
  • 対応するプログラム行(-g付きでコンパイルした場合)
    が表示される.

x (メモリの確認

xで指定したアドレスから指定した分だけ表示することができる.
下は10個のi(instruction)0x555555555139から表示する例.

gdb
x /10i 0x555555555139

image.png

xで表示できる形式は以下のページを参照.

reg (レジスタの表示

レジスタファイルの状態を表示.

gdb
reg

image.png

xinfo register

指定したレジスタの値を見る.

gdb
xinfo register <register>

image.png

set (メモリ,レジスタ書き換え

メモリやレジスタの書き換えができる.

下のは0x555555555139に1をエンディアンに従い書きこむ例.

gdb
set *0x555555555139=1

image.png

以下はrax0を書き込む例

gdb
set $rax=0x1623475869

image.png

c

continue.プログラムの再開.

c

n

next
命令を一つ進める.

n

s

step
命令を一つ進める.サブルーチンの中に入る.(call命令で呼ばれている関数の中に入る.nは入らない.

s

q (終了

gdbを終了

q

直前のコマンドと同じコマンド

何も入力せずEnterキーを押すことで直前に実行したコマンドをもう一度実行できます.
stepとかnextでプログラムを進めたいときに便利です.

おわりに

間違いがあったら教えてください.
東京高専プロコンゼミ① Advent Calendar 2022
の8日目の記事です.ほかの記事もぜひご覧ください.

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0