Gnu-debugger-gdb-debugging-example2

提供:Dev Guides
移動先:案内検索

GDB-デバッグの例2

メモリが初期化されていないためにコアダンプが発生する別のプログラムを作成してみましょう。

#include <iostream>
using namespace std;

void setint(int*, int);
int main()
{
   int a;
   setint(&a, 10);
   cout << a << endl;

   int *b;
   setint(b, 10);
   cout <<* b << endl;

   return 0;
}

void setint(int *ip, int i)
{
  * ip = i;
}

デバッグを有効にするには、プログラムを-gオプションでコンパイルする必要があります。

$g++ -g crash.cc -o crash

注: C ソースコードを使用しているため、g コンパイラを使用しています。

Linuxプログラムでこのプログラムを実行すると、次の結果が生成されます。

segmentation fault (core dumped)

次に、gdbを使用してデバッグします。

$ gdb crash
(gdb) r
Starting program:/home/tmp/crash
10
10
Program received signal SIGSEGV, Segmentation fault.
0x4000b4d9 in _dl_fini () from/lib/ld-linux.so.2

(gdb) where
#0  0x4000b4d9 in _dl_fini () from/lib/ld-linux.so.2
#1  0x40132a12 in exit () from/lib/libc.so.6
#2  0x4011cdc6 in __libc_start_main () from/lib/libc.so.6

#3  0x080485f1 in _start ()
(gdb)

残念ながら、ユーザー定義関数 main または setint のいずれでもプログラムはクラッシュしないため、有用なトレースまたはローカル変数情報はありません。 この場合、プログラムを1ステップ実行する方が便利な場合があります。

(gdb) b main
# Set a breakpoint at the beginning of the function main

(gdb) r
# Run the program, but break immediately due to the breakpoint.

(gdb) n
# n = next, runs one line of the program

(gdb) n
(gdb) s
setint(int*, int) (ip=0x400143e0, i=10) at crash2.C:20
# s = step, is like next, but it will step into functions.
# In this case the function stepped into is setint.

(gdb) p ip
$3 = (int *) 0x400143e0

(gdb) p *ip
1073827128
  • ipの値は、ipが指す整数の値です。 この場合、それは異常な値であり、問​​題があることの強力な証拠です。 この場合の問題は、ポインターが適切に初期化されなかったため、メモリ内のランダムな領域(アドレス0x40014e0)を指していることです。 運がよければ、* ipに値を割り当てるプロセスはプログラムをクラッシュさせませんが、終了時にプログラムをクラッシュさせる問題が発生します。