362
331

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

はじめてのgdb

Last updated at Posted at 2017-01-29

linux環境でC言語のデバッグを行う方にむけて、gdbの使い方を説明します。
初心者向けです。

gdbとは

デバッガです。ブレークポイントを張ったり、ステップ実行したり、
変数の中身を覗いたり、書き換えたり...そういうことが出来ます。
gccと同様、linuxには標準でインストールされています。

昔からあるツールであり、コマンドラインでの操作を行います。
IDEのデバッガがどうしても使えない環境でのデバッグに役立ちます。

メリット、デメリット

メリット:
・たいていのlinux環境で使える
・実行中のプログラムにattachしてデバッグ可能

デメリット:
・GUI画面がない。コマンドを覚える必要がある

使い方1:gdbから直接起動

①ソースファイルを、デバッグ可能な方式でコンパイルする
gcc -g3 test.c
→a.outが生成
※-g3とするとマクロの展開が可能となります。

②生成したオブジェクトファイルをgdbコマンドから実行
gdb a.out
→以後、gdbよりコマンドの入力を求められる
※この状態では、プログラムは実行されません。

③実行前にブレークポイントを設定
b test.c:256 # test.cの256行目にブレークを張る
b main # 関数main先頭にブレークを張る

④実行
run
※引数つきで実行したい場合は、run aaa bbb ccc と実行。

使い方2:既に稼動しているプログラムをデバッグ

①デバッグしたいプログラムのプロセスID(PID)を確認
ps -ef | grep a.out
※一番左端のフィールドに出てくる数字がPID

②attachする
gdb #引数無しで実行
attach 12345(↑で確認したpid)
※gdb attach $(pgrep a.out) とすれば、①、②を一行で実施できます。

以後、gdbを使ってブレークポイントを貼ったり変数を覗いたり出来ます。
プロセスを変えたいときはdetachしてから別のプロセスをアタッチできます。

コマンド集

主要なコマンドを紹介します。
すべて省略系で書いています。(ex. break -> b)

・ブレーク関連

コマンド 効果
b func1 関数func1にブレークポイントを貼る
b test.c:123 test.cの123行目にブレークポイントを貼る
w var1 変数var1にウォッチポイントを設定
i b ブレークポイント一覧を表示
d no 番号に対応するブレークポイントを削除

・実行関連

コマンド 効果
n ステップ実行(1行ずつ実行/関数は飛ばす)
s ステップ実行(1行ずつ実行/関数の中に入る)
c 次のブレークポイントまで処理を実行
f 現在の関数を抜けるまで処理を実行
u 現在のループを抜けるまで処理を実行
ret -1 現在の関数を戻り値-1として強制的に抜ける ※以降の処理は実行されない

・参照

コマンド 効果
p var1 変数var1の値を見る
(構造体ならa.bでメンバ変数を参照可能。ポインタなら*fpなどで中身を見れる。p strlen(buf)、p buf[3]、p a->bなど結構柔軟に見れます)
bt バックトレース(現在の関数が呼び出されるまでの経路)を表示
l ソースコードを表示
info macro マクロ名 マクロの定義を確認
i lo ローカル変数を全部見る

・値の書き換え

コマンド 効果
p var1=-1 変数var1の値を-1に変更

その他TIPS

  • bash等で使用しているショートカットを使用可能です。
    (例:Ctrl+aでカーソルを行頭に移動。参考: readlineの使い方)
    また、Tabキーによる変数名やgdb内コマンドの補完もしてくれます。
    (古い環境だとできないこともあります)

  • set print elements 0を実行するとメモリや構造体の全情報を表示してくれます。
    (サイズの大きい配列や構造体は、デフォルトだと途中までしか表示されません)

  • Ctrl-xを押した後、1または2を押すとTUIモードに移行します。
    画面が2分割され、ソースコードを見ながら上記コマンドを実行できるようになります。
    http://d.hatena.ne.jp/murase_syuka/20150912/1442021005

  • 子プロセスを生むプログラムの場合、以下のコマンドで子プロセスのデバッグが可能になります。
    set follow-fork-mode child

より詳細な情報

http://flex.phys.tohoku.ac.jp/texi/gdb-j/gdb-j_toc.html
http://sourceware.org/gdb/current/onlinedocs/gdb/

362
331
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
362
331

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?