linux環境でC言語のデバッグを行う方にむけて、gdbの使い方を説明します。
初心者向けです。
■gdbとは
デバッガです。ブレークポイントを張ったり、ステップ実行したり、
変数の中身を覗いたり、書き換えたり...そういうことが出来ます。
gccと同様、linuxには標準でインストールされています。
昔からあるツールであり、コマンドラインでの操作を行います。
IDEのデバッガがどうしても使えない環境でのデバッグに役立ちます。
■メリットデメリット
メリット:
・どんな環境でも使える
・実行中のプログラムに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を使ってブレークポイントを貼ったり変数を覗いたり出来ます。
プロセスを変えたいときはdetachしてから別のプロセスをアタッチできます。
■コマンド集
・ブレーク関連
b 関数名 関数funcにブレークポイントを貼る
b ファイル名:行数 test.cのline行目にブレークポイントを貼る
w 変数名 変数にウォッチポイントを設定
i b ブレークポイント一覧を表示
d no 番号に対応するブレークポイントを削除
・実行関連
n ステップ実行(1行ずつ実行/関数は飛ばす)
s ステップ実行(1行ずつ実行/関数の中に入る)
c 次のブレークポイントまで処理を実行
f 現在の関数を抜けるまで処理を実行
u 現在のループを抜けるまで処理を実行
ret -1 現在の関数を戻り値-1として強制的に抜ける ※以降の処理は実行されない
・参照
p 変数名 変数の値を見る(構造体のメンバはa.bで要素を見れる。ポインタの場合は*fpなどで中身を見れる)
bt バックトレース(現在の関数が呼び出されるまでの経路)を表示
l ソースコードを表示
info macro マクロ名 マクロの定義を確認
・値の書き換え
p 変数名=-1 変数の値を書き換える
■その他TIPS
・Ctrl-xを押した後、1または2を押すとTUIモードに移行します。
画面が2分割され、ソースコードを見ながら上記コマンドを実行できるようになります。
http://d.hatena.ne.jp/murase_syuka/20150912/1442021005
・set print elements 0 を実行するとメモリや構造体の全情報を表示してくれます。
(サイズの大きい配列や構造体は、デフォルトだと途中までしか表示されません)
・bash等で使用しているショートカットを使用可能です。(例:Ctrl+aでカーソルを行頭に移動)
また、Tabキーによる変数名やgdb内コマンドの補完もしてくれます。
・子プロセスを生むプログラムの場合、以下のコマンドで子プロセスのデバッグが可能になります。
set follow-fork-mode child