2013年3月28日木曜日

gdbについて

普段使っているgdbについて更に便利なコマンドを色々と見つけたので普段使っているものと合わせて纏めてみます。

gdbの使い方

まず、gccで-gオプションをつけてコンパイルした実行形式のファイル(a.outとする)を作ります。実行は

gdb a.out

でできます。

gdb上でプログラムを起動させるときは

r

で起動できます。

gdbを終了させるときは

q

で終了させます。

ブレークポイントの設定

ブレークポイントとは処理をストップしてデバッグしたいところで実行を一時中止させる為に設定するものです。設定は

b <行番号/関数名>

でできます。条件を付けたいときは後ろにif <条件>をつけます。例えばtest関数の先頭でa == 0のときだけ停止させたいときは

b test if a == 0

でできます。

設定したブレークポイントを確認したいときは

i b

で確認できます。

ブレークポイントでの進み方

ブレークポイントに入った後の進み方を説明します。ブレークポイント内で次の行に進むときは

n

を使います。

また、関数の呼び出し先をトレースするときには

s

を使います。ブレークポイントを抜けるには

c

を使います。

関数を途中で抜けるには

ret

を使います。

変数の表示

ブレークポイントで変数を表示するには

p <変数名>

で表示します。因みに関数を呼び出すこともできます。また、おなじみprintfも使えます。いちいちこれで表示するのが面倒という場合は

disp <変数名>

で自動で表示してくれます。displayの解除は

und <番号>

でできます。番号はdisplayされるときに表示される行頭の番号です。

毎行表示されるのが嫌なときは

wa <変数名>

で変数の内容が変更された時だけ表示されます。また、continueした後でも変数が更新されたときは止まって教えてくれます。変数が読み込まれたときに表示させたいときは

rwa <変数名>

変数の個数が多くなっていちいち表示させるのが面倒なときは

i lo

で定義されている変数の内容を全部表示してくれます。

バックトレース

sで関数の内部をトレースできましたが、

ba

で関数の呼び出し元をトレースすることもできます。呼び出し元についての情報を取得するには

f <番号>

を使います。番号はbaのときの行頭の番号です。

コアファイルについて

Segmentation Faultなどをしたときにコアダンプされることがあります。このコアファイルを使ってデバッグすることができます。コアファイルがtest.coreだとすると

gdb a.out test.core

のように起動し、bafpなどを使うと異常終了した直前の状況を把握することができます。

ちなみに、コアダンプされないときは

ulimit -c unlimited

するとコアファイルが生成されるようになります。また、CYGWINの場合は環境変数CYGWINに

error_start=dumper

を設定しておく必要があります。

変数の代入

黒魔術感がありますが、途中で変数に値を代入することもできます。

set va <変数>=<値>

でできます。

ブレークポイントの削除

ブレークポイントの削除は

cl <行番号/関数名>

でできます。一括で削除するときは

d

でできます。d <数字>を使うとi bしたときの行頭の番号で削除することもできます。

ソースコードの表示

現在の行の周辺のソースコードを表示するときは

l

を使います。