GDB の概要
GNU ツールセットのデバッガは GDB (GNU Debugger) であり、このプログラムはキャラクタ モードで動作する対話型ツールです。
Linux でのより有名なデバッガには、gdb に加えて、xxgdb、ddd、kgdb、ups などがあります。
GDB は主に次の 4 つの機能を実行するのに役立ちます。
- プログラムを起動し、カスタマイズされた要件に従って必要に応じて実行します。
- デバッグされたプログラムを指定したブレークポイントで停止できるようにします。(ブレークポイントは条件式にすることができます)
- プログラムが停止すると、その時点でプログラム内で何が起こっているかを調べることができます。
- プログラムの実行環境を動的に変更します。
1. デバッグ情報の生成
一般に、GDB は主に C/C++ プログラムをデバッグします。C/C++ プログラムをデバッグするには、まずコンパイル中に実行可能ファイルにデバッグ情報を追加する必要があります。これは、コンパイラ (cc/gcc/g++) の -g パラメータを使用して行うことができます。のように:
gcc -g こんにちは。c -o こんにちは
g++ -g hello.cpp -o hello
-g を指定しないと、プログラムの関数名と変数名は表示されず、実行時のメモリ アドレスのみに置き換えられます。
2.GDBを起動する
-
gdb を起動します: gdb プログラム
Program は実行可能ファイルで、通常は現在のディレクトリにあります。
-
動作パラメータを設定する
set args は実行時パラメータを指定します。(例: set args 10 20 30 40 50)
show args コマンドは、設定された動作パラメータを表示できます。
-
プログラムを開始する
run: プログラムの実行が開始されます。ブレークポイントがある場合は、最初のブレークポイントで停止します。
start: プログラムは 1 行下に実行されます。
3. ソースコードの表示
list コマンドを使用して、プログラムのソース コードを出力します。デフォルトでは、10 行が印刷されます。
Ø list linenum: linenm 行のコンテキストの内容を出力します。
Ø list function: function という名前の関数のソースプログラムを表示します。
Ø list: 現在行以降のソースプログラムを表示します。
Ø list -: 現在行より前のソースプログラムを表示します。
通常は現在行の上5行と下5行が印刷されますが、表示機能が上2行と下8行を印刷する場合はデフォルトで10行となります。もちろん表示をカスタマイズすることも可能です次のコマンドを使用して、表示ソースプログラムを 1 回設定します。
Ø set listsize count: 一度に表示されるソースコードの行数を設定します。
Ø show listsize: 現在のリストサイズ設定を表示します。
4. ブレークポイントの操作
1) 単純なブレークポイント
Break はブレークポイントを設定します。ブレークポイントは b と省略できます。
Ø b 10 ソースプログラムの10行目にブレークポイントを設定します
Ø b func は func 関数の入り口にブレークポイントを設定します。
2) 複数のファイルにブレークポイントを設定する
C++ では、class::function または function(type, type) 形式を使用して関数名を指定できます。
名前空間がある場合は、namespace::class::function または function(type,type) 形式を使用して関数名を指定できます。
Ø Break filename:linenum -- ソースファイル filename の linenum 行で停止します。
Ø Break filename:function -- ソースファイル filename の関数 function の入り口で停止します。
Ø Break class::function または function(type,type) -- クラス class の関数 function の入り口で停止します。
Ø Break namespace::class::function -- 名前空間が namespace であるクラスの function 関数の入り口で停止します
3) すべてのブレークポイントをクエリする
- 情報b
- 情報休憩
- 私は破ります
- ib
5. 条件付きブレークポイント
一般に、ブレークポイントの条件を設定するには、if キーワードの後にブレークポイント条件を使用します。
条件付きブレークポイントを設定します。
b test.c:8 if Value == 5
6. ブレークポイントを維持する
1) delete [range...] は指定されたブレークポイントを削除します。その短縮コマンドは d です。
- ブレークポイント番号が指定されていない場合は、すべてのブレークポイントが削除されます。range はブレークポイント番号の範囲を表します (例: 3 ~ 7)。
- 削除よりも良い方法は、ストップ ポイントを無効にすることです。GDB は無効になったストップ ポイントを削除しません。それでも必要な場合は、ごみ箱と同じように有効にしてください。
2) disable [range...] は、指定されたブレークポイントを無効にします。短縮されたコマンドは dis です。
何も指定しない場合は、すべての停止ポイントが無効になることを意味します。
3) Enable [range...] 無効なブレークポイントを有効にします。短縮されたコマンドは ena です。
何も指定しない場合は、すべての停止ポイントが有効になることを意味します。
7. コードのデバッグ
- run はプログラムを実行します。これは r と省略できます。
- 次のシングルステップ トレースでは、関数呼び出しが単純なステートメントとして実行されます。これは n と省略できます。
- step シングルステップ追跡では、関数は呼び出された関数の本体に転送されます。これは s と省略できます。
- 終了 入力した関数を終了します
- until ループ本体内でシングルステップ トレースを行う場合、このコマンドはループ本体を終了するまでプログラムを実行できます (u と省略できます)。
- continue はプログラムの実行を継続し、次のブレークポイントで停止します。ブレークポイントは c と省略できます。
- quit は gdb を終了します。これは q と省略できます。
8. データの閲覧
1) 実行時データの表示
print は、変数、文字列、式などの値を出力します。これらは p と省略できます。
p count は count の値を出力します
9. 自動表示
プログラムの停止時またはトレースのステップ実行時に、一部の変数が自動的に表示されるように設定できます。関連する GDB コマンドは表示です。
- 表示変数名
- 情報表示 -- 表示設定の自動的に表示される情報を表示します。
- undisplay num (情報表示中に表示される番号)
- 表示 dnums を削除… -- 自動表示を削除します。dnums は、設定された自動明示的な番号を意味します。複数の番号を同時に削除する場合は、番号をスペースで区切ることができます。番号の範囲を削除する場合は、マイナス記号を使用できます (例: 2-5)。
- ディスプレイ DNUM を無効にする…
- ディスプレイ DNUM を有効にする…
- disableとenableは自動表示された設定を削除するのではなく、無効化して元に戻すだけです。
10 変更した変数の値を表示する
1) ptype width -- 変数幅のタイプを確認します。
タイプ = ダブル
2) p width -- 変数 width の値を出力します。
4 ドル = 13
set var コマンドを使用すると、幅が GDB のパラメータではなく、プログラムの変数名であることを GDB に伝えることができます。たとえば、次のようになります。
set var width=47 //変数 var の値を 47 に設定します
プログラム変数の値を変更する場合は、set var 形式で GDB コマンドを使用するのが最善です。
要約:
GDB は強力なデバッグ ツールであり、これを使いこなすことで問題解決の効率が大幅に向上します。さらに、GDB はデバッグ ツールであるだけでなく、強力なプログラム分析ツールでもあります。これらのテクニックを習得することで、プログラムをより深く理解し、問題をより効果的に解決できるようになります。