GNU Debugger(GDB)は、GNUSystems用のオープンソースデバッガーです。デバッガーは移植可能であり、C /C++やFortranなどの複数の言語で使用できます。特定のブレークポイントでの状態を監視し、さらに実行するためにフローや値を変更することで、プログラムのデバッグに使用できます。通常、GDBはコマンドラインで実行されますが、GDB用にいくつかのGUIも開発されています。
この記事では、Ubuntu 20.04 LTS(Focal Fossa)でGDBを使用してCプログラムをデバッグする方法について説明します。
前提条件
- Ubuntu20.04システム
- 複数のファイルの名前を変更するためのsudo権限を持つユーザー。
注: この記事で説明するコマンドは、 Ubuntu 20.04 LTSでテストされています。 (Focal Fossa)。
パッケージのインストール
コンパイルとデバッグのための前提条件のGNパッケージをインストールします。ターミナルで次のコマンドを実行します:
$ sudo apt install gcc gdb -y
C-デバッグ用のプログラム例
コード
実行する前に、プログラムをコンパイルする必要があります。次のCコードをファイルmain.cにコンパイルします。 。
#include <stdio.h> int main() { for (int i=0; i<5; ++i) { printf("Iterator: %d\n", i); } return 0; }
GCCを使用してCプログラムをコンパイルする
通常、Cコードは次のコマンドを使用してGCCでコンパイルされます。
$ gcc main.c -o bin
記号を含めるには、別の引数を指定する必要があります バイナリで。これらの記号 プログラムを追跡およびデバッグするためにGDBによって使用されます。ターミナルで次のコマンドを実行して、Cコードをコンパイルします。
$ gcc -g main.c -o bin
binという名前の実行可能ファイル 表示されます。
テストプログラムを実行します
binという名前のバイナリファイル コマンドラインインターフェイスで他の実行可能ファイルと同じように実行できます。次のコマンドを使用して、ターミナルで実行します。
$ ./bin
コードの出力が表示されます。
Linuxでのアプリケーションのデバッグ
デバッガーの開始
ターミナルで次のコマンドを使用してGDBユーティリティを実行します。
$ gdb bin
Enterキーを押します。 GDBターミナルのコンソールが表示されます。 runを入力します このコンソールでコマンドを実行して、ユーティリティに引数として提供された実行可能ファイルを実行します。
(gdb) run
デバッグブレークポイント
ブレークポイントの追加
ブレークポイントはいくつかの方法で追加できます。 printfにブレークポイントを追加します コード内の関数。ターミナルで次のコマンドを実行して、ブレークポイントを追加します。
(gdb) break printf
または、行番号を使用してブレークポイントを追加することもできます。
(gdb) break 6
runを入力します コマンドを実行すると、プログラムはブレークポイントで停止します。
ブレークポイントのステップスルー
コマンド続行を使用します プログラムの実行を継続します。
(gdb) continue
プログラムの実行を継続するためのさまざまな目的のために、他に2つのコマンドがあります。
- ステップ:次の機械命令をステップ実行します。
- 次へ:コードの次の行に進みます。
コマンドの省略形も使用できます。 continueの略語のように コマンドはcです。
(gdb) c
ブレークポイントに関する情報
ブレークポイントに関する情報は、 infoを使用して確認できます。 gdbのコマンド 。ターミナルで次のコマンドを実行します:
(gdb) info breakpoints
ブレークポイントに関する情報が表示されます。
注:ブレークポイントの左側の数字は、他のコマンドで参照するために使用されます。
ブレークポイントの削除
ブレークポイントは、 deleteを使用して削除できます。 コマンドを実行し、 infoの出力で観察されたブレークポイント番号を参照します。 ユーティリティ。
(gdb) delete 1
これでブレークポイントが削除され、実行すると、プログラムは最後まで実行されます。
ウォッチ変数
変数は、監視ユーティリティを使用して監視できます。まず、変数が存在するスコープを入力する必要があります。この目的のために、最初に次のコマンドを使用してブレークポイントを追加します。
(gdb) break 6
次に、このブレークポイントに到達するコードを実行します。
(gdb) r
これで、変数 iがループします。 存在します。
時計 コマンドは、変数 iの以前の値と新しい値を監視するために使用されます ループ内。
(gdb) watch i
これで、 watchによって生成されたブレークポイント コマンドはブレークポイントのリストにも表示されます。ブレークポイントのリストは、次のコマンドを使用して表示できます。
(gdb) info breakpoints
さらに、先にブレークポイントを挿入する必要はありません。次のコマンドを使用して簡単に削除できます:
(gdb) delete 1
続行すると、変数が値を変更するたびにコードが値を表示し、古い値と新しい値の両方を表示します。
(gdb) c
同じコマンドを使用して、プログラムのさらなる反復も観察できます。
デバッガを終了
ターミナルで次のコマンドを実行して、デバッガーを終了します。
(gdb) quit
このクローズgdb ユーティリティとデフォルトのコマンドラインプロンプトが表示されます。
結論
この記事では、GDBでプログラムを実行および中断する方法について説明しました。さらに、変数の値が変更されたときにそれ自体を壊すようにも構成されました。この記事を読んだ後、GDBでプログラムを簡単にデバッグできることを願っています。