II-8-3. デバッグの基本

C言語プログラミングにおけるデバッグの方法を概説する。デバッグプリントの挿入、デバッグ情報の埋め込み方に始まり、デバッガの利用方法、デバッグに利用するシンボル情報を有効にするコンパイル、ブレークポイントやステップ実行といったデバッグの基本的な作業について説明する。

【学習の要点】

* プログラムの入出力をプログラマが検証するには、いくつかの方法がある。単純に画面に変数を出力する方法や、デバッガを使ってプログラムの実行を途中で止め、その後はインタラクティブに実行する方法などが用いられる。

* 通常リリース時には、デバッグのための情報を保持している必要はない。gccのデフォルトの動きでは、デバッグ情報は保持されないので、gdbでデバッグする場合には、コンパイル時に明示的にデバッグ情報を保持するオプションをつける必要がある。

* C言語において、gdbでプログラムの動作を途中で止めるには、止めたい部分の関数名を指定してブレークポイントを設定する。ブレークポイントに遭遇すると、その関数を実行する直前で処理が止まり、インタラクティブなモードに移る。

図II-8-3. ステップ実行

【解説】

1) デバッグのパターン

* 具体的なデバッグの作業は、プログラムのある時点で変数にどのような値がセットされているかどうか(メモリの状態)を見て、その値が正しいかどうか確認することと、期待する値と食い違いが生じたソースコード上の場所を発見することである。

* デバッグの方法にはいくつかのパターンがある。

- 変数出力命令 (デバッグプリント) の埋め込み

最も原始的な方法で、ソースコード内にprintfのような変数の内容を出力する命令を組み込み、実行時に出力される内容を確認する方法である。

- デバッグシンボルの埋め込み

コンパイル時にデバッグシンボルを残す (gccでは-gオプションをつける) 方法。gdbのようなデバッガにてインタラクティブにプログラムをステップ実行し、必要であれば変数の内容やアドレスを出力することができる。

2) ブレークポイント

* デバッガでプログラムを実行する際に、プログラムを途中で止めるよう指定するのがブレークポイントである。gdbでは、ブレークポイントとして、ソースコードの行番号や関数名などが指定できる。

* 統合開発環境などでは、視覚的に行にブレークポイントを設定することができる。しばしば、画鋲(ピン)のアイコンで表される。

* ブレークポイントでプログラムを止めた後は、ステップ実行(一行ずつ実行するなど)を行なって、不良箇所を発見する。

3) ステップ実行

* ブレークポイントでプログラムを止めたら、以下のような操作により、インタラクティブに実行を継続する。

- ステップイン

現在の位置がサブルーチンの呼び出しポイントである場合、サブルーチンの内部へ移動する。

- ステップアウト

現在のサブルーチンの残りの部分を実行し、その呼び出し元へ戻る。

- ステップオーバー

現在の位置から、ソースコードの次の行へ移動する。現在の行がサブルーチンの呼び出しポイントである場合は、そのサブルーチンの実行後の状態となる。

* 不正なメモリ参照を行なった場合などは、ステップ実行は途中で失敗する。失敗が起こると不良箇所は見つけ易い。ステップ実行により実行した部分に不良が存在することが多いからである。

* 論理的な不良をデバッガによって発見したい場合は、ステップ実行によりその都度メモリの状態を検証する必要がある。

OSS Course Naviのコンテンツは IPA OSS モデルカリキュラムを基としています。