Gdb またはGNUProjectDebuggerは、プログラムをデバッグする必要がある場合の優れたツールです。ブレークポイントを設定したり、変数の値の変更を監視したり、プログラムがその状態の時点で停止しているときにプログラムの値を変更したりして、gdbの機能の一部を選択するだけで続行できます。
このチュートリアルでは、RHEL 8にgdbをインストールし、単純なCアプリケーションでどのように機能するかをテストします。
このチュートリアルでは、次のことを学びます。
- gdbのインストール方法
- デバッグシンボルを使用して単純なCアプリケーションをコンパイルする方法
- gdbを使用して実行中のアプリケーションにブレークポイントを設定する方法
- アプリケーション内で特定の変数の実際の値を出力する方法
gdbを使用してforループをステップスルーします。
使用されるソフトウェア要件と規則
カテゴリ | 使用する要件、規則、またはソフトウェアバージョン |
---|---|
Red Hat Enterprise Linux 8 | |
gdb 8.2 | |
rootまたはsudo を介したLinuxシステムへの特権アクセス コマンド。 | |
# –指定されたLinuxコマンドは、rootユーザーとして直接、またはsudo を使用して、root権限で実行する必要があります。 コマンド$ –特定のLinuxコマンドを通常の非特権ユーザーとして実行する必要があります |
RedhatLinux8にgdbをインストールする方法ステップバイステップの説明
このチュートリアルでは、いくつかの変数を設定し、いくつかのテキストを出力し、後でその変数の値を変更する単純なCアプリケーションを使用します。 gdb
の一部の機能を表示するためにのみ作成されています 、実際の使用法はありません。
Cプログラミング言語に慣れていない場合は、Linuxの概要でC開発をチェックして開始できます。今のところ、vars.c
に入れる次のソースコードについて考えてみましょう。 テキストファイル:
#include <stdio.h>
int main()
{
int i = 1;
int j = 10;
printf("Variables set\n)";
i++;
j = 20;
printf("Variable values modified\n");
return 0;
}
この単純なプログラムを使用して、gdb
をテストします 。コードから、値変数i
に気付くかもしれません。 およびj
プログラムの通常の実行ではtakeが公開されることはないため、それらの値がどこでいつ発生するかはわかりません。この場合、それは単純なメモリの浪費ですが、i
のユースケースを考えてみてください。 ハードコードされたパスワード、チートコード、その他の宝物など、重要なものが含まれている可能性があります(または、プログラムの計算がうまくいかない場所を見つけることができません)。
-
gdb
Development Tools
の一部です パッケージグループなので、開発ツールをインストールしている場合は、すでにgdbがあります。そうでない場合は、単独でインストールできます:# dnf install gdb
テストにはglibcのdebuginfoも必要です:
# dnf debuginfo-install glibc-2.28-18.el8.x86_64
- デバッガツールを入手し、ソースコードを入手しました。デバッグを有効にするには、デバッグシンボルを使用してプログラムをコンパイルする必要があります(
-g
を追加します)。 オプション):$ gcc -g -o vars vars.c
vars
を実行すると プログラムでは、printf
の文字列を出力します 行ですが、i
については言及しません およびj
、予想どおり。$ ./vars Variables set Variable values modified
-
i
の値を知る必要があります およびj
それらが最初に設定されたとき、およびプログラムが終了する前。 7行目と10行目(printf
)について考えてみます。 行)ソース内。これらの行で実行を停止し、値を取得してから、プログラムを再び解放するなどの方法があれば理想的です。これを正確に実行して、gdb
をテストします。 。コンパイルされたvars
から始めます 引数として実行可能:$ gdb vars GNU gdb (GDB) Red Hat Enterprise Linux 8.2-3.el8 Copyright (C) 2018 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "x86_64-redhat-linux-gnu". Type "show configuration" for configuration details. For bug reporting instructions, please see: <http://www.gnu.org/software/gdb/bugs/>. Find the GDB manual and other documentation resources online at: <http://www.gnu.org/software/gdb/documentation/>. For help, type "help". Type "apropos word" to search for commands related to "word"... Reading symbols from vars...done. (gdb)
gdb
プログラム内の記号を読み取り、行動を促すプロンプトを表示します。vars
この時点ではプログラムは開始されていません。メモを確認し、breakpoint
を設定します 7行目:(gdb) break 7 Breakpoint 1 at 0x40059c: file vars.c, line 7.
そして10行目:
(gdb) break 10 Breakpoint 2 at 0x4005b1: file vars.c, line 10.
ブレークポイントを設定したら、実行を開始します:
(gdb) run Starting program: /tmp/devel/vars Breakpoint 1, main () at vars.c:7 7 printf("Variables set\n");
実行は最初のブレークポイントで停止し、隠れた変数の値を出力できます:
(gdb) print i $1 = 1 (gdb) print j $2 = 10
必要な情報の最初の部分を取得しました。実行を続けましょう:
(gdb) continue Continuing. Variables set Breakpoint 2, main () at vars.c:10 10 printf("Variable values modified\n");
次のブレークポイントでも同じ方法で値を出力できます:
(gdb) print i $3 = 2 (gdb) print j $4 = 20
必要なものはすべて手に入れました。ブレークポイントが残っていないため、テキストの最後の行を印刷した後、アプリケーションは正常に終了します。
(gdb) continue Continuing. Variable values modified [Inferior 1 (process 2330) exited normally] (gdb) q
シークレット変数の値を取得し、
gdb
をテストしました 本来あるべき姿と同じくらい便利です。