GDB-クイックガイド
デバッガーは、他のプログラムを実行するプログラムであり、ユーザーがこれらのプログラムを制御し、問題が発生したときに変数を調べることができます。
GNUデバッガ。これは別名 gdb, は、UNIXシステムでCおよびC ++プログラムをデバッグするための最も一般的なデバッガーです。
GNUデバッガーは、以下に関する情報を取得するのに役立ちます。
コアダンプが発生した場合、プログラムはどのステートメントまたは式でクラッシュしましたか?
関数の実行中にエラーが発生した場合、プログラムのどの行にその関数の呼び出しが含まれ、パラメーターは何ですか?
プログラム実行中の特定の時点でのプログラム変数の値は何ですか?
プログラム内の特定の式の結果は何ですか?
GDBはどのようにデバッグしますか?
GDBを使用すると、特定のポイントまでプログラムを実行し、その時点で特定の変数の値を停止して出力するか、プログラムを1行ずつステップ実行して、各行の実行後に各変数の値を出力できます。
GDBはシンプルなコマンドラインインターフェースを使用します。
注意点
GDBはメモリリークに関連するバグを見つけるのに役立ちますが、メモリリークを検出するためのツールではありません。
GDBは、エラーでコンパイルされるプログラムには使用できず、それらのエラーの修正には役立ちません。
インストールする前に、次のコマンドを発行して、Unixシステムにgdbがすでにインストールされているかどうかを確認してください。
$gdb -help
GDBがインストールされている場合は、GDB内で使用可能なすべてのオプションが表示されます。GDBがインストールされていない場合は、新規インストールに進みます。
以下で説明する簡単な手順に従って、システムにGDBをインストールできます。
step 1: gdbをインストールするための前提条件があることを確認してください。
ANSI準拠のCコンパイラ(gccを推奨-gdbは他のコンパイラによって生成されたコードをデバッグできることに注意してください)
gdbをビルドするパーティションには115MBの空きディスク容量が必要です。
gdbをインストールするパーティションには、20MBの空きディスク容量が必要です。
GNUの解凍プログラム、 gzip
ザ・ make ユーティリティ-GNUバージョンは問題なく動作することが知られており、他のバージョンもおそらく同様に動作します。
step 2: からgdbソースディストリビューションをダウンロードします ftp.gnu.org/gnu/gdb. (使用しました gdb-6.6.tar.gz これらの手順については。)ビルドディレクトリに配布ファイルを配置します。
step 3:ビルドディレクトリで、gdb-6.6.tar.gzを解凍し、アーカイブからソースファイルを抽出します。ファイルの抽出が完了したら、作業ディレクトリを、ビルドディレクトリに自動的に作成されたgdb-6.6ディレクトリに変更します。
$ build> gzip -d gdb-6.6.tar.gz
$ build> tar xfv gdb-6.6.tar
$ build> cd gdb-6.6
step 4: configureスクリプトを実行して、プラットフォームのソースツリーを構成します。
$ gdb-6.6> .⁄configure
step 5: を使用してgdbをビルドします make ユーティリティ。
$ gdb-6.6> make
step 6: rootとしてログインし、次のコマンドを使用してgdbをインストールします。
$ gdb-6.6> make install
step 7: 必要に応じて、インストールの完了後にgdbビルドディレクトリとアーカイブファイルを削除することで、ディスク領域を再利用できます。
$ gdb-6.6> cd ..
$ build> rm -r gdb-6.6
$ build> rm gdb-6.6.tar
これでシステムにgdbがインストールされ、使用する準備が整いました。
A Debugging Symbol Tableコンパイルされたバイナリプログラムの命令を、ソースコードの対応する変数、関数、または行にマップします。このマッピングは次のようになります。
プログラム命令⇒アイテム名、アイテムタイプ、元のファイル、定義された行番号。
シンボルテーブルは、プログラムに埋め込むことも、別のファイルとして保存することもできます。したがって、プログラムのデバッグを計画している場合は、プログラムのデバッグに必要な情報を含むシンボルテーブルを作成する必要があります。
シンボルテーブルについて、次の事実を推測できます。
シンボルテーブルは、プログラムの特定のバージョンで機能します。プログラムが変更された場合は、新しいテーブルを作成する必要があります。
多くの場合、デバッグビルドは、リテール(非デバッグ)ビルドよりも大きく、低速です。デバッグビルドには、シンボルテーブルとその他の補助情報が含まれています。
自分でコンパイルしなかったバイナリプログラムをデバッグする場合は、作成者からシンボルテーブルを入手する必要があります。
GDBがシンボルテーブルからすべての情報を1行ずつ読み取れるようにするには、少し異なる方法でコンパイルする必要があります。通常、プログラムは次のようにコンパイルされます。
gcc hello.cc -o hello
これを行う代わりに、以下に示すように-gフラグを使用してコンパイルする必要があります。
gcc -g hello.cc -o hello
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を終了します
はじめに:開始と停止
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に指示します。無視するレベルはさまざまです。
次の例を実行して、プログラムとコアダンプのデバッグ手順を理解してください。
デバッグ例1
この例は、ゼロ除算中に発生した例外が原因で発生しているエラーをキャプチャする方法を示しています。
デバッグ例2
この例は、初期化されていないメモリが原因でコアをダンプできるプログラムを示しています。
どちらのプログラムもC ++で記述されており、さまざまな理由でコアダンプを生成します。これらの2つの例を実行すると、コアダンプを生成するCまたはC ++プログラムをデバッグできるようになります。
このチュートリアルを終えると、GNUデバッガーを使用したCまたはC ++プログラムのデバッグについて十分に理解している必要があります。これで、他のデバッガーはGDBに非常に似ているため、他のデバッガーの機能を簡単に学ぶことができます。他のデバッガーも使用して、それらの機能に精通することを強くお勧めします。
市場にはかなりの数の優れたデバッガーがあります。
DBX Debugger-このデバッガはSunSolarisに同梱されており、dbxのmanページ(man dbx)を使用して、このデバッガに関する完全な情報を取得できます。
DDD Debugger-これはdbxのグラフィカルバージョンであり、Linuxで無料で利用できます。完全な詳細を持っているために、DDDのmanページを使用して、すなわち、男がddd。
次のリンクからGNUデバッガーに関する包括的な詳細を入手できます。GDBを使用したデバッグ