% gcc -g -o sample2 sample2.c % ./sample2 a = 456, b = 123 Segmentation fault
先程と同様,gdbを起動してrunすると,例えば以下のようになる.
% gdb sample2 ... (gdb) run Starting program: .../sample2 a = 456, b = 123 Program received signal SIGSEGV, Segmentation fault. 0x0000000100000e89 in swap (i=0x7fff5fbff96c, j=0x0) at sample2.c:6 6 *i = *j; (gdb)
(gdb) print j $1 = (int *) 0x0
問題は,swap関数の第二引数にj=0x0とNULLが渡されていると ころにある.では,この関数呼出がどこで起こったものかを探そう.停止地点ま での関数呼出しの履歴は,backtraceコマンドで表示できる.
(gdb) backtrace #0 0x0000000100000e89 in swap (i=0x7fff5fbff96c, j=0x0) at sample2.c:6 #1 0x0000000100000f08 in f () at sample2.c:20 #2 0x0000000100000f44 in main () at sample2.c:25
では,swapが呼び出された時点での変数の値などを調べてみよう.しかし,
停止している地点はswap関数が呼び出された後なので,このままではf中の局所変数aやcを調べることができない.この場合,frameまたはupコマンドで,フレームを移動することによって,swapが呼び
出された直前の状態を確認することができる.
(gdb) frame 1 (または up) #1 0x0000000100000f08 in f () at sample2.c:20 20 swap(&a, c);
(gdb) print c $2 = (int *) 0x0
NAKAZAWA Koji