Gnu-debugger-quick-guide

提供:Dev Guides
移動先:案内検索

GNUデバッガーとは何ですか?

デバッガーは他のプログラムを実行するプログラムで、ユーザーはこれらのプログラムを制御し、問題が発生したときに変数を調べることができます。

  • gdbとも呼ばれるGNUデバッガは、UNIXシステムでCおよびC ++プログラムをデバッグするための最も一般的なデバッガです。

GNUデバッガーは、次に関する情報を取得するのに役立ちます。

  • コアダンプが発生した場合、プログラムはどのステートメントまたは式でクラッシュしましたか?
  • 関数の実行中にエラーが発生した場合、プログラムのどの行にその関数の呼び出しが含まれ、パラメーターは何ですか?
  • プログラム実行中の特定の時点でのプログラム変数の値は何ですか?
  • プログラム内の特定の式の結果は何ですか?

GDBのデバッグ方法

GDBを使用すると、特定のポイントまでプログラムを実行し、そのポイントで特定の変数の値を停止して出力したり、一度に1行ずつプログラムをステップ実行し、各行の実行後に各変数の値を出力したりできます。

GDBは単純なコマンドラインインターフェイスを使用します。

注意点

  • GDBはメモリリーク関連のバグを見つけるのに役立ちますが、メモリリークを検出するツールではありません。
  • GDBは、エラー付きでコンパイルされるプログラムには使用できず、エラーの修正には役立ちません。

GDB-インストール

インストールに進む前に、次のコマンドを発行して、Unixシステムにgdbが既にインストールされているかどうかを確認します。

$gdb -help

GDBがインストールされている場合、GDB内で利用可能なすべてのオプションが表示されます。 GDBがインストールされていない場合は、新規インストールに進みます。

以下に説明する簡単な手順に従って、システムにGDBをインストールできます。

ステップ1: gdbをインストールするための前提条件があることを確認します。

  • ANSI準拠のCコンパイラ(gccを推奨-gdbは他のコンパイラによって生成されたコードをデバッグできることに注意してください)
  • gdbをビルドするパーティションには、115 MBの空きディスク容量が必要です。
  • gdbをインストールするパーティションには、20 MBの空きディスク容量が必要です。
  • ステップ2:*次のコマンドを使用して、Linuxマシンにgdbをインストールします。
$ sudo apt-get install libc6-dbg gdb valgrind
  • ステップ3:*次のコマンドを使用して、ヘルプ情報を見つけます。
$gdb -help

これでシステムにgdbがインストールされ、使用する準備が整いました。

GDB-シンボルのデバッグ

  • デバッグシンボルテーブル*は、コンパイルされたバイナリプログラムの命令を、ソースコードの対応する変数、関数、または行にマップします。 このマッピングは次のようになります。
  • プログラム命令⇒アイテム名、アイテムタイプ、オリジナルファイル、行番号が定義されています。

シンボルテーブルは、プログラムに埋め込むか、別のファイルとして保存できます。 したがって、プログラムのデバッグを計画している場合は、プログラムのデバッグに必要な情報を含むシンボルテーブルを作成する必要があります。

シンボルテーブルに関する次の事実を推測できます。

  • シンボルテーブルは、プログラムの特定のバージョンで機能します。プログラムが変更された場合、新しいテーブルを作成する必要があります。
  • デバッグビルドは、多くの場合、小売(非デバッグ)ビルドよりも大きく、低速です。デバッグビルドには、シンボルテーブルとその他の補助情報が含まれています。
  • 自分でコンパイルしなかったバイナリプログラムをデバッグする場合は、作成者からシンボルテーブルを取得する必要があります。

GDBがすべての情報をシンボルテーブルから1行ずつ読み取れるようにするには、少し異なる方法でコンパイルする必要があります。 通常、プログラムを次のようにコンパイルします。

gcc hello.cc -o hello

これを行う代わりに、以下に示すように-gフラグを使用してコンパイルする必要があります。

gcc -g hello.cc -o hello

GDB-コマンド

GDBには多数のコマンドのリストがありますが、次のコマンドが最も頻繁に使用されるコマンドです。

  • b main -プログラムの先頭にブレークポイントを置きます
  • b -現在の行にブレークポイントを置きます
  • b N -行Nにブレークポイントを置きます
  • b + N -現在の行からN行下にブレークポイントを置きます
  • b fn -関数「fn」の先頭にブレークポイントを置きます
  • d N -ブレークポイント番号Nを削除します
  • info break -ブレークポイントのリスト
  • r -ブレークポイントまたはエラーまでプログラムを実行します
  • c -次のブレークポイントまたはエラーまでプログラムの実行を継続します
  • f -現在の機能が終了するまで実行する
  • s -プログラムの次の行を実行します
  • s N -プログラムの次のN行を実行します
  • n -sと似ていますが、関数にステップインしません
  • u N -現在の行の前にN行を取得するまで実行します
  • p var -変数「var」の現在の値を出力します
  • bt -スタックトレースを出力します
  • u -スタックのレベルを上げる
  • d -スタックのレベルを下げます
  • q -gdbを終了します

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に指示します。 無視するレベルはさまざまです。

GDB-デバッグの例

プログラムとコアダンプのデバッグ手順を理解するには、次の例をご覧ください。

  • リンク:/gnu_debugger/gdb_debugging_example1 [デバッグ例1] +この例は、ゼロ除算中に発生した例外が原因で発生しているエラーをキャプチャする方法を示しています。
  • リンク:/gnu_debugger/gdb_debugging_example2 [デバッグ例2] +この例は、初期化されていないメモリが原因でコアをダンプできるプログラムを示しています。

どちらのプログラムもC で記述されており、さまざまな理由によりコアダンプが生成されます。 これらの2つの例を確認した後、コアダンプを生成するCまたはC プログラムをデバッグすることができます。

GDB-まとめ

このチュートリアルを終えた後、GNU Debuggerを使用してCまたはC ++プログラムをデバッグする方法を十分に理解している必要があります。 これで、他のデバッガーはGDBと非常によく似ているため、他のデバッガーの機能を簡単に習得できるはずです。 他のデバッガーも使用して、それらの機能に精通することを強くお勧めします。

市場にはかなりの数の優れたデバッガーがあります。

  • * DBXデバッガー*-このデバッガーはSun Solarisに同梱されており、dbxのマニュアルページ(man dbx)を使用して、このデバッガーに関する完全な情報を取得できます。
  • * DDDデバッガ*-これはdbxのグラフィカルバージョンであり、Linuxで自由に利用できます。 完全な詳細を得るには、dddのmanページ、つまり_man ddd_を使用します。

次のリンクから、GNUデバッガーに関する包括的な詳細を取得できます。http://web.mit.edu/gnu/doc/html/gdb_tocl [GDBを使用したデバッグ]

GDB-便利なリソース

次のリソースには、GNUデバッガーに関する追加情報が含まれています。 これについての詳細な知識を得るためにそれらを使用してください。

GNUデバッガーの便利なリンク

GNUデバッガに関する有用な書籍

このページにサイトを登録するには、 contact @ finddevguides.com にメールを送信してください。