LinuxでGNUデバッガーを使用する方法

GNU Debuggerは、プログラムのデバッグ、クラッシュの分析、または特定の時点でのプログラムの動作の確認に使用されます。これは1980年代にGNUプロジェクトによって開発され、最も広く使用されているコマンドラインデバッガーの1つであり、最も人気のあるGNUソフトウェアの1つでもあります。

最初に小さなCプログラムを作成し、それをデバッグします。開始するには、新しいを作成します .c を使用してファイル vim または任意のエディター:

vim test.c

次のCプログラムを作成します。

#include int main(){int i = 5; float f = 5.5 i = i + 3; f = f + 2.2; printf( "iとfの値は次のとおりです:%dと%f \ n"、i、f); 0を返します。 }

押す 逃れる vimコマンドモードに移動します。次に、次のように入力します :wq プログラムを保存して終了します。

コンパイルして、プログラムが実行されるかどうかを確認します。

gcc test.c -o test ./test iとfの値は次のとおりです:8と7.700000

プログラムでデバッグサポートを有効にするには、 でコンパイルします -g 国旗。フラグが使用されていない場合でも、オプションは限られていますが、ユーザーはプログラムをデバッグできます。

gcc test.c -g -o test

デバッグを開始するには 実行可能ファイル テストgdb、 私たちは走る:

gdbテスト

それは開きます gdb コンソール、ここで入力できます gdb コマンド。コマンドのリストを表示するには、 ヘルプ 指図。

$(gdb)helpコマンドのクラスのリスト:エイリアス-他のコマンドのエイリアスブレークポイント-プログラムを特定のポイントで停止させるデータ-データファイルの検査-ファイルの内部の指定と検査-メンテナンスコマンドの不明瞭-実行中の機能の不明瞭-プログラムスタックの実行-スタックステータスの確認-ステータス照会サポート-サポート機能トレースポイント-プログラムを停止せずにプログラム実行をトレースするユーザー定義-ユーザー定義コマンド「help」に続けてクラス名を入力しますそのクラスのコマンドのリストについては。すべてのコマンドのリストについては、「helpall」と入力してください。完全なドキュメントを表示するには、「help」に続けてコマンド名を入力します。 「適切な単語」と入力して、「単語」に関連するコマンドを検索します。明確な場合は、コマンド名の省略形を使用できます。

次に、次のように入力できます class_nameを助けます そのクラスに属するコマンドを表示します。部分文字列を使用してコマンドを検索するには、次を使用します。 適切な部分文字列.

プログラムが関数に入るときにブレークポイントを設定するには、 走る:

$(gdb)break main

ここでは、コード内の唯一の関数にブレークポイントを設定します。 主要。コマンドを使用する 走る 次のブレークポイントまで、または終了するまでプログラムを実行します。

$(gdb)実行

関数内の特定の場所にブレークポイントを設定するには、 使用する:

ブレーク*メイン+4

これにより、関数mainの4行目にブレークポイントが設定されます。

今、 プログラムのフローを次のコード行にステップオーバーするには、 単に実行します ステップ 指図。

$(gdb)ステップ5:float f = 5.5;

変数の内容を表示するには、 走る 画面 .

$(gdb)display i 6:i = 5

変数の内容を変更するには、 これは、変数の特定の値の下でプログラムの実行を分析するために必要になる場合があります。 変数を設定=式.

$(gdb)変数i = 10を設定$(gdb)表示i 7:i = 10

ここで、「式」は任意の有効な(算術/論理)式にすることができます。簡単にするために、変数に別の値(10)を割り当てるだけです。 .

プログラムのアセンブリコードを印刷するには、 コマンドを使用 functionnameを分解します:

ただ使う 分解する プログラム全体のアセンブリコードを印刷します。アセンブリコードの特定の行にある矢印に注意してください。これは、デバッグセッションが現在その特定のメモリ位置(つまり、そのコード行)で一時停止されていることを示します。

コードの特定の行でデバッガーをジャンプするには、 走る:

$(gdb)jump * main + 20x400528で続行します。ブレークポイント2、test.c:3のmain()の0x000000000040052a 3 int main(){1:i = 2:f = 3:h =(void *)0x0 4:main = {int()} 0x400526 5:i == 

これにより、デバッガーは関数内のコードの2行目のメモリ位置にジャンプします。 主要。ここでは、メインの先頭から直接2番目の場所にジャンプしたことに注意してください。したがって、可変 が設定されなかったため、デバッガーが変数のアドレスのメモリ内容にアクセスできないというエラーをスローします。 .

これらは、Linuxで実行可能ファイルのデバッグを開始するのに役立つ基本的なコマンドの一部です。このページの情報がお役に立てば幸いです。