GDB-デバッグプログラム

はじめに:開始と停止

  • gcc -g myprogram.c

    • myprogram.cをデバッグオプション(-g)でコンパイルします。それでも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 コードの詳細を詳しく調べるのに適しています。

  • 仕上げ

    • 現在の機能の実行を終了し、一時停止します(ステップアウトとも呼ばれます)。誤って関数に足を踏み入れた場合に便利です。

ブレークポイントまたはウォッチポイント

ブレークポイントは、デバッグにおいて重要な役割を果たします。プログラムが特定のポイントに達すると、プログラムを一時停止(中断)します。変数を調べて変更し、実行を再開できます。これは、入力障害が発生した場合、または入力をテストする場合に役立ちます。

  • 休憩45

  • myfunctionを壊す

    • 45行目またはmyfunctionにブレークポイントを設定します。ブレークポイントに達すると、プログラムは一時停止します。
  • 時計x == 3

    • 条件が変更されたとき(x == 3が変更されたとき)にプログラムを一時停止するウォッチポイントを設定します。ウォッチポイントは関数呼び出しのたびに中断することなく、特定の入力(myPtr!= NULL)に最適です。

  • 継続する

    • ブレークポイント/ウォッチポイントによって一時停止された後、実行を再開します。プログラムは、次のブレークポイント/ウォッチポイントに到達するまで続行されます。

  • Nを削除

    • ブレークポイントNを削除します(ブレークポイントは作成時に番号が付けられます)。

変数の設定

実行時に変数を表示および変更することは、デバッグの重要な部分です。関数に無効な入力を提供するか、他のテストケースを実行して、問題の根本原因を見つけてください。通常、プログラムが一時停止しているときに変数を表示/設定します。

  • xを印刷

    • 変数xの現在の値を出力します。元の変数名を使用できるのは、(-g)フラグが必要な理由です。定期的にコンパイルされたプログラムでは、この情報が削除されます。

  • x = 3に設定

  • x = yを設定します

    • xを設定値(3)または別の変数(y)に設定します
  • myfunction()を呼び出す

  • myotherfunction(x)を呼び出す

  • strlen(mystring)を呼び出す

    • ユーザー定義関数またはシステム関数を呼び出します。これは非常に便利ですが、バグのある関数の呼び出しには注意してください。

  • xを表示

    • 変数xの値を常に表示します。これは、すべてのステップまたは一時停止の後に表示されます。特定の値を常にチェックしている場合に便利です。

  • xを表示しない

    • displayコマンドで表示される変数の定数表示を削除します。

バックトレースとフレームの変更

スタックは、現在の関数呼び出しのリストです。これは、プログラムのどこにいるかを示します。フレームは、そのような引数として1つの関数呼び出しの詳細を格納します。

  • bt

    • Backtracesまたは、現在の関数スタックを出力して、現在のプログラムのどこにいるかを示します。mainが関数a()を呼び出し、b()を呼び出し、c()を呼び出す場合、バックトレースは次のようになります。

  • c <= current location 
    b 
    a 
    main
  • up

  • ダウン

    • 関数スタックの上下の次のフレームに移動します。あなたがいる場合c, あなたはに移動することができます b または a ローカル変数を調べます。

  • 戻る

    • 現在の関数から戻ります。

信号の処理

シグナルは、タイマーやエラーなどの特定のイベントの後にスローされるメッセージです。GDBは、シグナルに遭遇すると一時停止する場合があります。代わりにそれらを無視することをお勧めします。

  • ハンドル[信号名] [アクション]

  • SIGUSR1をnostopで処理する

  • SIGUSR1noprintを処理する

  • SIGUSR1を処理する無視する

    • 特定のシグナル(SIGUSR1)が発生したときに無視するようにGDBに指示します。無視するレベルはさまざまです。