11.3 シンボリックデバッガ(gdb)によるデバッグ

  2.プログラム例1のデバッグ
 最初に、11-2節「デバッグライトによるデバッグ」で最初の例題として用いたプログラム(キーボードから整数値を1つ入力し、その値が10かどうかを判定するプログラム)を対象にgdbを適用してみましょう (実際のプログラムには行番号はついていません)。

 1  #include <stdio.h>
 2  
 3  int main(void){
 4        int value; /* キーボードから入力された数値 */
 5  
 6        printf("Enter number : ");
 7        scanf("%d", value);
 8  
 9        if(value = 10){/* 数値が10であるか判定 */
10          printf("Input number is 10.\n");
11        }
12        else {
13          printf("Input number is not 10.\n");
14        }
15  }
 上記のプログラムをシンボリックデバッガgdbで解析した例を次に示します (以降はコメントです)。

$ gcc -g keyinput.c     #デバッガにかけるために、 -gオプションをつけてコンパイルする。
$ gdb a.out                #実行ファイルを引数としてgdbを起動する。
GNU gdb 4.17.0.11 with Linux support
Copyright 1998 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i386-redhat-linux"...
(gdb) break 9           #7行目のscanf文で入力されたvalueの値を見るために、 9行目の
                                if文の前でプログラムが停止するように設定する。このような停止
                                    位置をブレイクポイントと呼ぶ。
Breakpoint 1 at 0x8048424: file keyinput.c, line 9.
(gdb) run                  #プログラムの実行
Starting program: /home/miyao/Soft2/a.out 
Enter number : 23       #整数値の入力

Breakpoint 1, main () at keyinput.c:9
9 if(value = 10){          /* 数値が10であるか判定 */ 
                              #設定したブレイクポイントである 9行目の実行直前でプログラム
                                 が停止したことを示している。
(gdb) print value          #変数値valueの表示
$1 = 134518020         #入力したはずの値23が表示されない!この時点で、scanf文の
                                  valueにアドレス演算子がないことに気づく。
(gdb) print value = 23   #変数valueに値23を代入する。
$2 = 23
(gdb) step                  #次の行を実行
10 printf("Input number is 10.\n"); 
                              #valueの値が23のはずなのに、if文の条件が真になっている。
                                 ここで、if文の条件文が代入式になっていることに気づく。 
(gdb) quit                  #gdbの終了
The program is running. Exit anyway? (y or n) y