すべてのプログラマは、どんなに経験が豊富であっても、ソフトウェアのバグを完全に回避することはできません。したがって、トラブルシューティングとバグ修正は、ソフトウェア開発サイクルにおいて最も重要なタスクの 1 つになっています。テストやコードのセルフレビューなど、バグのトラブルシューティングにはさまざまな方法がありますが、専用のデバッガ ソフトウェアも問題を特定して修正できるようにするのに役立ちます。
C/C プログラミング言語、または Fortran および Modula-2 を使用してソフトウェアを開発するプログラマにとって、優れたデバッガ ツール GDB は朗報です。 GDB は、プログラマがコード内のバグやその他の問題をより簡単にデバッグできるだけでなく、多くの便利な機能やオプションも提供します。この記事では、GDB デバッガーの基本と、GDB デバッガーが提供する便利な機能とオプションのいくつかについて説明します。
始める前に、この記事のすべての手順と例は Ubuntu 14.04 LTS でテストされていることを言及しておきます。チュートリアルのサンプル コードはすべて C 言語で書かれており、使用されるシェルは bash (4.3.11)、GDB のバージョンは 7.7.1 です。
平たく言えば、GDB を使用すると、実行中のプログラムの内部フローを確認でき、問題の特定に役立ちます。次のセクションで実際の例を使用して GDB デバッガーの使用について説明しますが、その前に、後で役立ついくつかの基本的な点について説明します。
まず、GDB などのデバッガーを正常に使用するには、デバッガーに必要なデバッグ情報がコンパイラーによって生成されるように、指定された方法でプログラムをコンパイルする必要があります。たとえば、gcc コンパイラ (このチュートリアルの後半で C プログラムの例をコンパイルするために使用します) でコードをコンパイルする場合、-g コマンド ライン オプションを使用する必要があります。
gcc コンパイラのマニュアル ページの -g コマンド ライン オプションについては、ここを参照してください。
次のステップでは、GDB デバッガーがシステムにインストールされていることを確認します。このツールがインストールされておらず、Debian ベースのシステム (Ubuntu など) を使用している場合は、次のコマンドを使用して簡単にツールをインストールできます:
リーリー他のディストリビューションへのインストール方法については、こちらをご覧ください。
上記のようにプログラムをコンパイルし (gcc -g コマンド ライン オプション)、GDB デバッガーをインストールしたら、次のコマンドを使用してプログラムをデバッグ モードで実行できます。 リーリー
これを行うと GDB デバッガーが初期化されますが、この時点では実行可能プログラムは開始されません。この時点で、デバッグ関連の設定を定義できます。たとえば、特定の行または関数にブレークポイントを設定して、GDB がその行でプログラムの実行を一時停止するようにすることができます。次に、プログラムを開始するには、次の gdb コマンドを入力して実行する必要があります:
リーリー
ここで、プログラムにコマンド ライン パラメーターが必要な場合は、ここでこれらのパラメーターを指定できることに注意してください。例えば:### リーリーGDB には、デバッグ時にいつでも役立つ便利なコマンドが多数用意されています。これらのコマンドのいくつかについては、次のセクションで説明します。
このコードが何を行うのかを簡単に説明します。 val 配列内の各値を取得して out 変数に代入し、tot の前の値と 0xffffffff/out の結果値を加算して、tot 変数に代入します。
ここで発生する問題は、このコードでコンパイルされた実行可能プログラムを実行すると、次のエラーが生成されることです。 リーリー
したがって、このコードをデバッグするには、最初のステップとして、-g
オプションを使用してプログラムをコンパイルします。コマンドは次のとおりです:
リーリー
次に、GDB デバッガーを実行し、デバッグする実行可能プログラムを指定しましょう。コマンドは次のとおりです:
リーリー
注 (gdb) はデバッガー プロンプト情報です。ここでは、break 11 コマンドを入力しただけです。
それでは、GDB でプログラムの実行を開始してみましょう:
リーリー初めてブレークポイントにヒットすると、GDB は次の出力を表示します。
リーリーご覧のとおり、デバッガにはブレークポイントが配置されているコード行が表示されます。では、このときの out の値を出力してみましょう。次のように:###
(gdb) print out $1 = 5 (gdb)
如上所示,值 5被打印出来了。这个时候一切都还是正常的。让调试器继续执行程序直到命中下一个断点,可以通过使用 c 命令来完成:
c
重复上述操作,直到 out值变为0 时。
... ... ... Breakpoint 1, main () at gdb-test.c:11 11 tot = tot + 0xffffffff/out; (gdb) print out $2 = 99 (gdb) c Continuing. Breakpoint 1, main () at gdb-test.c:11 11 tot = tot + 0xffffffff/out; (gdb) print out $3 = 0 (gdb)
现在,为了进一步确认问题,我使用 GDB 的s (或 step) 命令代替 c 命令。因为,我只想让当前程序在第 11 行之后暂停,再一步步执行,看看这个时候是否会发生崩溃。
以下是执行之后输出信息:
(gdb) s Program received signal SIGFPE, Arithmetic exception. 0x080484aa in main () at gdb-test.c:11 11 tot = tot + 0xffffffff/out;
是的,如上输出的第一行内容所示,这就是抛出异常的地方。当我再次尝试运行s 命令时,问题最终也得到了确认:
(gdb) s Program terminated with signal SIGFPE, Arithmetic exception. The program no longer exists.
通过这种方式,你就可以使用 GDB 调试你的程序。
GDB 提供了很多功能供用户研究和使用,在这里,我们仅仅只介绍了很少一部分内容。通过 GDB 的手册页可以进一步了解这个工具,当你在调试代码的时候,尝试使用一下它。GDB 调试器有一定的学习难度,但是它很值得你下功夫学习。
以上がLinux での C プログラムのデバッグの福音 - gdbの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。