GNUデバッガーまたはGDB:Linuxプログラムの強力なソースコードデバッグツール

A debugger plays a vital role in any software development system. Nobody can write a bug-free code all at once. During the course of development, bugs are being raised and needs to be solved for further enhancement. A development system is incomplete without a debugger. Considering the open source developers community, GNU Debugger is their best choice. It is also used for commercial software development on UNIX type platforms.

Debugging source code with GNU Debugger

GNUデバッガー、別名gdbは、コードが実行されている間にスニークしたり、プログラムがクラッシュする直前の瞬間に何をしようとしていたかを確認することができます。GDBは基本的にソースコードの欠陥を見つけるために4つの主要なことを行うのに役立ちます。

  1. 一般的な動作に影響を与える可能性のある引数を指定してプログラムを開始します。
  2. 指定された条件でプログラムを停止します。
  3. クラッシュを検査するか、プログラムが停止した時を調べます。
  4. コードを変更して修正されたコードで実験を行います。

私たちは、あまり苦労せずにCおよびC++で書かれたプログラムをデバッグするためにgdbを使用できます。現時点では、DModula-2Fortranなどの他のプログラミング言語のサポートは部分的です。

GNUデバッガーまたはGDBの入門

GDBgdbコマンドを使用して起動されます。gdbを発行すると、プラットフォームに関する情報が表示され、(gdb)プロンプトに移動します。以下に示します。

[root@fedora20 ~]# gdb
サンプル出力
GNU gdb (GDB) Fedora 7.6.50.20130731-19.fc20 
Copyright (C) 2013 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". 
(gdb)

helpリストを入力して、gdb内で利用できる異なるクラスのコマンドを表示します。クラス名に続けてhelpを入力すると、そのクラス内のコマンドのリストが表示されます。help allを入力して、すべてのコマンドのリストを取得します。コマンド名の略語は曖昧でない場合は許可されています。たとえば、nを入力してnext、またはcを入力してcontinueなどとすることができます。

最もよく使用されるGDBコマンド

よく使用されるgdbコマンドは、次のテーブルにリストされています。これらのコマンドは、gdbコマンドプロンプト(gdb)から使用する必要があります。

Command
Description
run
Start a program execution
quit
Quit gdb
print expr
Print expression where expr may be a variable name too
next
Go to next line
step
Step into next line
continue
Continue from the current line till the end of program or next break point

次の2つのコマンドstepnextの違いに注意してください。 nextコマンドは、次の行が関数呼び出しの場合、関数の内部には入りません。一方、stepコマンドは関数の内部に入り、そこで何が起こるかを見ることができます。

A sample session with GDB

次のソースコードを考えてみましょう。

// sum.c
#include <stdio.h> 

int sum (int a, int b) { 
	int c; 
	c = a + b; 
	return c; 
} 

int main() { 
	int x, y, z; 
	printf("\nEnter the first number: "); 
	scanf("%d", &x); 
	printf("Enter the second number: "); 
	scanf("%d", &y); 
	z = sum (x, y); 
	printf("The sum is %d\n\n", z); 
	return 0; 
}

出力ファイルのデバッグを行うためには、-gオプションを使用してgccで同じようにコンパイルする必要があります。

$ gcc -g sum.c -o sum

出力ファイルsumは、次の2つの方法のいずれかを使用してgdbに添付することができます。

1. gdbへの引数として出力ファイルを指定することで。

$ gdb sum

2. fileコマンドを使用してgdb内で出力ファイルを実行することで。

$ gdb
(gdb) file sum

listコマンドはソースコードファイル内の行をリストアップし、ポインタを移動します。したがって、最初のlistは最初の10行を表示し、次のlistは次の10行を表示します。

(gdb) list
1	#include <stdio.h>   
2	 
3	int sum (int a, int b) { 
4		int c; 
5		c = a + b; 
6		return c; 
7	} 
8	 
9	int main() { 
10		int x, y, z;

実行を開始するには、runコマンドを発行します。今、プログラムは通常通りに実行されます。しかし、デバッグのためにソースコードにいくつかのブレークポイントを設定するのを忘れましたね?これらのブレークポイントは関数または指定された行に指定できます。

(gdb) b main

:私はbreakの略称bを使用しました。

main関数でブレークポイントを設定した後、プログラムを再実行すると11行目で停止します。同じ効果がある場合は、行番号が事前にわかっている場合もあります。

(gdb) b sum.c:11

次に、コードの行を逐次実行するには、次へ あるいはnコマンドを使用します。次へコマンドは、関数にブレークポイントが設定されていない限り、関数内のコードに進みません。今度はプリントコマンドを試してみましょう。以下のように関数sumにブレークポイントを設定します。

(gdb) b sum 
Breakpoint 1 at 0x4005aa: file sum.c, line 5. 
(gdb) r 
Starting program: /root/sum 

Enter the first number: 2 
Enter the second number: 3 

Breakpoint 1, sum (a=2, b=3) at sum.c:5 
5		c = a + b; 
(gdb) p a 
$1 = 2 
(gdb) p b 
$2 = 3
(gdb) c 
Continuing. 
The sum is 5 

[Inferior 1 (process 3444) exited normally]

実行中のプログラムにコマンドラインパラメーターが必要な場合は、実行コマンドと一緒に同じを提供してください。

(gdb) run   . . .

現在実行中のプログラムに関連する共有ライブラリファイルをリストアップすることができます。

(gdb) info share 
From                To                  Syms Read   Shared Object Library 
0x00000035a6000b10  0x00000035a6019c70  Yes         /lib64/ld-linux-x86-64.so.2 
0x00000035a641f560  0x00000035a6560bb4  Yes         /lib64/libc.so.6

変数の変更

GDBはプログラムの実行中に変数を変更する機能も備えています。これを試してみましょう。上記のように16行目にブレークポイントを設定してプログラムを実行します。

(gdb) r 
Starting program: /root/sum 

Enter the first number: 1 
Enter the second number: 2 

Breakpoint 1, main ( ) at sum.c:16 
16		printf("The sum is %d\n\n", z); 
(gdb) set z=4 
(gdb) c 
Continuing. 
The sum is 4

a = 1b = 2となるべき結果はz = 3です。しかし、ここでは1行目で最終結果を z = 4に変更しました。このように、gdbを使用するとデバッグを容易にすることができます。

ブレークポイントの有効化/無効化

すべてのブレークポイントのリストを取得するには、info breakpointsと入力します。

(gdb) info breakpoints 
Num     Type           Disp Enb Address            What 
1       breakpoint     keep y   0x00000000004005c2 in main at sum.c:11

ここでは1つのブレークポイントしかなく、To. を無効にするには、ブレークポイント番号を指定して無効にするコマンドを使用します。その後に有効化するには、有効にするコマンドを使用します。

(gdb) disable 1 
(gdb) info breakpoints 
Num     Type           Disp Enb Address            What 
1       breakpoint     keep n   0x00000000004005c2 in main at sum.c:11

ブレークポイントもdeleteコマンドで削除できます。

実行中のプロセスのデバッグ

GNU/Linuxシステムでは多数のプロセスがバックグラウンドで実行されています。実行中のプロセスをデバッグするには、まずその特定のプロセスのプロセスIDを見つける必要があります。pidof コマンドを使用するとプロセスのpidを取得できます。

$ pidof <process_name>

そして、このpidをgdbにアタッチする必要があります。2つの方法があります。

1. gdbと一緒にpidを指定して。

$ gdb -p <pid>

2. gdbからattachコマンドを使用して。

(gdb) attach <pid>

今のところは以上です。これは、ソースコードのデバッグを始めるためのgdbの基本です。これ以上に説明されていることよりもはるかに多くの活用方法があります。たとえば、スタック情報、環境変数などを使用してデバッグできます。これらの機能を試してみてください…

Source:
https://www.tecmint.com/debug-source-code-in-linux-using-gdb/