5.3. GDB
基本的に、大半のデバッガーのように、GDB は非常に厳密に制御された環境でコンパイルされたコードの実行を管理します。この環境は、GDB の操作に必要な以下の基本的なメカニズムを可能にします。
- デバッグされるコード内のメモリの検査および修正 (たとえば、変数の読み取りおよび設定)。
- 主に実行中かまたは停止しているかなどの、デバッグされるコードの実行状態の制御。
- コードの特定セクションの実行の検出 (プログラマーの関心のある特定エリアに達した際にコードの実行を停止するなど)。
- メモリの特定領域へのアクセスの検出 (指定された変数にアクセスした際にコードの実行を停止するなど)。
- 制御された方法による (それ以外の停止されたプログラムから) のコードの複数部分の実行。
- シグナルなどのプログラミングによる非同期イベントの検出。
これらのメカニズムの操作は、コンパイラーが生成する情報にほぼ依存します。たとえば、変数の値を表示するには、GBD は以下を認識する必要があります。
- メモリ内の変数の場所
- 変数の性質
つまり、倍精度の浮動小数点値を表示するには、文字ストリングを表示する場合とは非常に異なるプロセスが必要であることを意味しています。構造などの複雑なケースでは、GDB は構造内の個々のエレメントの特徴だけでなく、構造の形態も認識する必要があります。
GDB が完全に機能するには以下のアイテムが必要です。
- デバッグ情報
- GDB の操作の多くは、プログラムのデバッグ情報に依存します。この情報は通常コンパイラーから発生するものですが、これらの多くは、プログラムのデバッグ中にのみ必要になります。つまり、プログラムの通常の実行時には使用されません。この理由により、コンパイラーは常にデフォルトでこの情報を利用可能にする訳ではありません。たとえば、GCC は
-g
フラグを使ってこのデバッグ情報を提供するために明示的に指示される必要があります。GDB の機能を完全に利用するには、GDB でデバッグ情報を利用できるようにすることを強くお勧めします。GDB は、利用可能なデバッグ情報がない状態でコードに対して実行される場合にその使用が非常に限られます。 - ソースコード
- GDB (またはそれ以外のデバッガー) の最も役に立つ機能の 1 つに、プログラム実行内のイベントと状況を、ソースコードのこれらに対応するロケーションに関連付ける機能があります。このロケーションは、通常はソースファイルの特定の行または一連の行を参照します。当然これを行うには、プログラムのソースコードがデバッグ時に GDB で利用可能であることが必要です。
5.3.1. 単純な GDB
GDB には文字通り数十のコマンドが含まれます。このセクションでは、最も基本的なコマンドを説明します。
br
(breakpoint)- breakpoint コマンドは、GDB に対し実行内の指定ポイントに達すると実行を一時停止するように指定します。このポイントは数多くの方法で指定することができますが、最も一般的な方法は、単にソースファイルの行番号か、または関数の名前になります。任意の数のブレークポイントを同時に有効にすることができます。これは、しばしば GDB の開始後に発行される最初のコマンドになります。
r
(run)run
コマンドはプログラムの実行を開始します。run
を任意の引数を使って実行すると、それらの引数は、プログラムが正常に開始されているかのように実行可能ファイルに渡されます。通常、ユーザーはブレークポイントを設定した後にこのコマンドを発行します。
実行可能ファイルを開始する前か、または実行可能ファイルがたとえばブレークポイントで停止する場合、プログラムの状態を多くの面から検査することができます。以下のコマンドは、検査に使用できるより一般的な方法です。
p
(print)print
コマンドは、指定された引数の値を表示し、この引数にはプログラムに関連するほぼすべてのものを使用できます。通常引数は、単純な単一値から構造に至る、様々な複雑度を持つ変数の名前です。また引数は、プログラム変数やライブラリー関数、またはテスト中のプログラムで定義される関数の使用を含む、現在の言語で有効な式として使用することもできます。bt
(backtrace)backtrace
は、実行が停止されるまで使用される関数呼び出しのチェーンを表示します。これは、定義することが難しい原因を持つ重大なバグ (セグメント化障害など) を調査する際に役に立ちます。l
(list)- 実行が停止すると、
list
コマンドは、プログラムが停止した場所に対応するソースコードの行を表示します。
停止したプログラムの実行は、数多くの方法で再開することができます。以下は最も一般的なものです。
c
(continue)continue
コマンドは、プログラムの実行を再開し、プログラムがブレークポイントが検出するか、特定または緊急の条件 (エラーなど) を検出するか、または停止するまで継続して実行されます。n
(next)continue
のように、next
コマンドも実行を再開しますが、continue
コマンドの暗黙的な停止条件のほかに、next
は、現在のソースファイル内のコードの次のシーケンシャル行でも実行を停止します。s
(step)next
のように、step
コマンドも、現在のソースファイル内のコードのそれぞれのシーケンシャル行で実行を停止します。ただし、実行が 関数呼び出しを含むソース行で現在停止している場合、GDB は関数呼び出しを入力した後に (それを実行するのではなく) 実行を停止します。fini
(finish)- 前述のコマンドのように、
finish
コマンドは実行を再開しますが、実行が関数から返されると停止します。
最後に、以下は 2 つの基本的なコマンドになります。