Gnu-debugger-gdb-debugging-programs
提供:Dev Guides
GDB-プログラムのデバッグ
はじめに:起動と停止
- gcc -g myprogram.c
- デバッグオプション(-g)を使用してmyprogram.cをコンパイルします。 まだa.outを取得しますが、生のメモリの場所ではなく、GDB内で変数と関数名を使用できるようにするデバッグ情報が含まれています(楽しくはありません)。
- gdb a.out
- ファイルa.outでGDBを開きますが、プログラムは実行しません。 プロンプト(gdb)が表示されます-すべての例はこのプロンプトからのものです。
- r
- r arg1 arg2
- r <file1
- 以前にロードされた「a.out」を実行する3つの方法。 直接実行する(r)、引数を渡す(r arg1 arg2)、またはファイルをフィードすることができます。 通常、実行する前にブレークポイントを設定します。
- help
- hブレークポイント
- ヘルプトピックを一覧表示(ヘルプ)または特定のトピックに関するヘルプを取得(hブレークポイント)。 GDBは十分に文書化されています。
- q-GDBを終了します
コードのステップ実行
ステッピングにより、プログラムのパスをトレースし、クラッシュまたは無効な入力を返すコードをゼロにすることができます。
- l
- l 50
- l myfunction
- 現在の行(l)、特定の行(l 50)、または関数(l myfunction)の10行のソースコードをリストします。
- next 次の行までプログラムを実行し、その後一時停止します。 現在の行が関数の場合、関数全体を実行してから一時停止します。 next *は、コードをすばやく確認するのに適しています。
- step
- 行ではなく、次の命令を実行します。 現在の命令が変数を設定している場合、それは next と同じです。 関数の場合、関数にジャンプし、最初のステートメントを実行してから一時停止します。 step は、コードの詳細に飛び込むのに適しています。
- 終える
- 現在の関数の実行を終了してから一時停止します(ステップアウトとも呼ばれます)。 誤って関数にステップインした場合に役立ちます。
ブレークポイントまたはウォッチポイント
ブレークポイントはデバッグで重要な役割を果たします。 特定のポイントに達すると、プログラムを一時停止(中断)します。 変数を調べて変更し、実行を再開できます。 これは、入力障害が発生したとき、または入力をテストするときに役立ちます。
- 45を破る
- 私の機能を破る
- 45行目またはmyfunctionにブレークポイントを設定します。 プログラムは、ブレークポイントに達すると一時停止します。
- 時計x == 3
- 条件が変わると(x == 3が変わると)プログラムを一時停止するウォッチポイントを設定します。 ウォッチポイントは、_every_関数呼び出しで中断することなく、特定の入力(myPtr!= NULL)に最適です。
- 持続する
- ブレークポイント/ウォッチポイントによって一時停止された後、実行を再開します。 プログラムは、次のブレークポイント/ウォッチポイントに到達するまで続行します。
- Nを削除
- ブレークポイントNを削除します(ブレークポイントには作成時に番号が付けられます)。
変数を設定する
実行時の変数の表示と変更は、デバッグの重要な部分です。 関数に無効な入力を提供するか、他のテストケースを実行して、問題の根本原因を見つけてください。 通常、プログラムの一時停止時に変数を表示/設定します。
- 印刷x
- 変数xの現在の値を出力します。 元の変数名を使用できることが、(-g)フラグが必要な理由です。定期的にコンパイルされるプログラムでは、この情報が削除されます。
- x = 3を設定
- x = yを設定
- xを設定値(3)または別の変数(y)に設定します
- myfunction()を呼び出します
- myotherfunction(x)を呼び出します
- strlen(mystring)を呼び出します
- ユーザー定義関数またはシステム関数を呼び出します。 これは非常に便利ですが、バグのある関数の呼び出しには注意してください。
- ディスプレイx
- すべてのステップまたは一時停止の後に表示される変数xの値を常に表示します。 特定の値を常にチェックしている場合に便利です。
- 非表示x
- displayコマンドによって表示される変数の定数表示を削除します。
バックトレースとフレームの変更
スタックは、現在の関数呼び出しのリストです。プログラム内のどこにいるかを示します。 _frame_は、引数などの単一の関数呼び出しの詳細を格納します。
- bt
- *バックトレース*または現在の関数スタックを表示して、現在のプログラムのどこにいるかを表示します。 mainが関数a()、b()、c()を呼び出す場合、バックトレースは
c <= current location
b
a
main
up
down
*関数スタック内で次のフレームに上下に移動します。* c、*にいる場合は、 *b* または *a* に移動してローカル変数を調べることができます。
戻る
- 現在の関数から戻ります。
信号の処理
シグナルは、タイマーやエラーなどの特定のイベントの後にスローされるメッセージです。 GDBは、信号に遭遇すると一時停止する場合があります。代わりに無視することもできます。
- ハンドル[信号名] [アクション]
- SIGUSR1 nostopを処理します
- SIGUSR1 noprintを処理します
- SIGUSR1無視を処理します
- 特定のシグナル(SIGUSR1)が発生したときに無視するようにGDBに指示します。 無視するレベルはさまざまです。