スクリーンデバッガ(xxgdb)の使用法
1 プログラムのデバッグ
デバッグとは、プログラム中に潜んだバグの発見から修正までの一連の作業をいう。プログラム中のバグを発見する方法は、大きく次の2つに分けられる。
・あらかじめソースコードにデバッグ情報を出力させる命令を加えておく。処理の進行に伴う変数の値の変化を確認できる。
・デバッガを利用する。ソースコードに手を入れずに、プログラムのステップ実行、任意の時点での変数の確認や代入が可能である。
ここでは、デバッガを利用する方法について説明する。
2 デバッグの概要
本章では、xxgdbというデバッガを用いたデバッグ手法について説明する。例として、実験3決定木のサンプルプログラムsample_gain.cを用いてxxgdbの使い方を説明する。
2.1 デバッグの前準備
xxgdbを用いてソースコードを参照しながらデバッグを行うためには、実行コード中にソースコード情報をあらかじめ埋め込んでおく必要がある。Cコンパイラgccでは、-gオプションを指定してコンパイルすれば良い。
%gcc –g sample_gain.c –o sample_gain –lm
2.2 デバッガの起動
デバッガを起動する際、デバッグ対象のプログラムの実行コードを引数に指定する。
%xxgdb sample_gain &
コマンドを実行すると、図1のようなウィンドウが表示される。初期状態では、上から順に次の領域が表示される。
・ファイル:ソースファイル名およびカーソルの行番号
・ソース:ソースファイルの内容
・メッセージ:実行状態
・コマンド:主要コマンドのボタン
・ダイアログ:タイピングインターフェース
図1:xxgdbの起動
2.3 ブレークポイントの設置
プログラムの実行前に、ブレークポイント(実行を停止させる地点)を設定しておく。ソース領域中のブレークポイントを設置したい行をクリックすると、カーソルがその箇所に移動する。その状態で[break]ボタンをクリックすると、図2のような表示が現れる。
図2:ブレークポイント
2.4 実行開始
[run]ボタンをクリックすることで、プログラムの実行を開始する。実行が先頭から順に進み、ブレークポイントが現れると停止する。次に実行されるはずの行が矢印で表示される(図3)。すなわち、プログラムは、矢印行の実行直前で停止している。
図3:実行停止状態
2.5 ステップ実行
プログラムの途中で実行が停止している状態から1行ずつ処理を進めるには、stepやnextなどのステップ実行コマンドを用いる。これらはそれぞれ、[step][next]ボタンをクリックすることで実行される。Stepでは、関数の呼び出しの中もステップ実行を行う(図4(a))。それに対し、nextでは、呼び出された関数は一気に実行し、次の行に進む(図4(b))。
(a)step (b)next
図4:ステップ実行
2.6 変数の値の表示
一時的に変数の値の表示を行うには、printコマンドを用いる。ソース領域中で値を表示したい変数名をクリックすると、その変数名が反転表示される。その状態で[print]ボタンをクリックするとダイアログに変数の値が表示される。
変数の値の変化をみるには、displayコマンドが便利である。printコマンドと同様に変数名を反転表示させ、[display]ボタンをクリックする。すると、ウィンドウ最下部に新たな領域が現れ、変数の値が表示される(図5)。printコマンドと異なり、displayコマンドでの表示は、プログラムの実行が進んでも消滅せずに残る。
図5:display表示
2.7 変数への値の代入
変数への値の代入は、setコマンドで行う。このコマンドのボタンは用意されていないため、ダイアログから直接入力する必要がある。
(xxgdb) set max_data = 1
2.8 実行再開
現在停止している地点から連続実行を再開するには、[cont]ボタンをクリックする。すると次のブレークポイントまで処理が進み、プログラムを最後まで実行した場合は、プログラムの実行が終了する。
バグの特定ができた場合は、[quit]ボタンをクリックしてxxgdbを終了し、ソースコードを適切に修正する。
3 セグメントエラーについて
不正メモリアクセスなどのバグを含むプログラムをxxgdbを用いて実行した場合、実行途中で強制終了させられ、ダイアログ部分に強制終了直前の状態の変数の値などが表示される(図6)。
図6:セグメントエラー
4 xxgdbで使用する主なコマンド一覧
help :使用できるコマンドの一覧を表示。
(引数にコマンド名を指定することにより、そのコマンドの使用方法を見る。)
run :プログラムを実行する。
cont :ブレークポイント以降のプログラムを続行する。
next :指定したステップ数分プログラムを進める(関数内をトレースしない)。
何も指定しない場合は1ステップ。
step :指定したステップ数分プログラムを進める(関数内をトレースする)。
何も指定しない場合は1ステップ。
finish :現関数の処理を完了する。
break :カーソルで指定した行にブレークポイントを設定する。
tbreak :カーソルで指定した行に一時的なブレークポイントを設定する。
delete :ブレークポイントの設定を無効にする。
up :関数のスタックにおいて指定したレベル数だけ上位スタックに移動する
(関数の呼び出し元に移動する)。
down :関数のスタックにおいて指定したレベル数だけ下位スタックに移動する。
print :関数に格納されている値を表示。
print* :ポインタで示されている番地に格納されている値を表示。
display :関数に格納されている値を常時表示。
undisplay:displayにより常時表示されている変数の表示を無効にする。
args :引数の値を表示。
locals :ローカル変数の値を表示。
stack :関数におけるスタックとレースを行う。
(現在の関数がどの関数に呼ばれているかを表示する)。
edit :エディタモードへの切り替え。
search :指定した語句の検索。
quit :xxgdbの終了。