概要
- addr2lineコマンドを使用して、Cプログラムのsegmention faultを調査する
条件
- linux限定
実験環境
- ubuntu 12.10
コマンド概要
addr2line - アドレスをファイル名と行番号に変換する。
http://linuxjm.sourceforge.jp/html/GNU_binutils/man1/addr2line.1.html
手順
1.ターミナルの起動
2.環境変数の設定(バックトレース取得用)
export SEGFAULT_SIGNALS=all
export LD_PRELOAD=/lib/i386-linux-gnu/libSegFault.so
3.サンプルソースのダウンロード
git clone https://github.com/masayukioguni/segmentation-fault.git
4.ビルド
cd segmentation-fault; gcc -g -o main main.c
5.実行
./main
6.segmention fault発生
*** Segmentation fault
Register dump:
EAX: 00000000 EBX: b7719000 ECX: bf902c34 EDX: bf902bc4
ESI: 00000000 EDI: 00000000 EBP: bf902b88 ESP: bf902b60
EIP: 0804841c EFLAGS: 00210286
CS: 0073 DS: 007b ES: 007b FS: 0000 GS: 0033 SS: 007b
Trap: 0000000e Error: 00000006 OldMask: 00000000
ESP/signal: bf902b60 CR2: 00000000
FPUCW: ffff037f FPUSW: ffff0000 TAG: ffffffff
IPOFF: 00000000 CSSEL: 0000 DATAOFF: 00000000 DATASEL: 0000
ST(0) 0000 0000000000000000 ST(1) 0000 0000000000000000
ST(2) 0000 0000000000000000 ST(3) 0000 0000000000000000
ST(4) 0000 0000000000000000 ST(5) 0000 0000000000000000
ST(6) 0000 0000000000000000 ST(7) 0000 0000000000000000
Backtrace:
./main[0x804841c] ***1***
./main[0x8048444]
/lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xf3)[0xb758c4d3]
./main[0x8048341]
Memory map:
08048000-08049000 r-xp 00000000 08:01 441864 /xxxx/xxxx/xxxx/segmentation-fault/main
08049000-0804a000 r--p 00000000 08:01 441864 /xxxx/xxxx/xxxx/segmentation-fault/main
0804a000-0804b000 rw-p 00001000 08:01 441864 /xxxx/xxxx/xxxx/segmentation-fault/main
08677000-08698000 rw-p 00000000 00:00 0 [heap]
b7553000-b756f000 r-xp 00000000 08:01 1049295 /lib/i386-linux-gnu/libgcc_s.so.1
b756f000-b7570000 r--p 0001b000 08:01 1049295 /lib/i386-linux-gnu/libgcc_s.so.1
b7570000-b7571000 rw-p 0001c000 08:01 1049295 /lib/i386-linux-gnu/libgcc_s.so.1
b7571000-b7573000 rw-p 00000000 00:00 0
b7573000-b7716000 r-xp 00000000 08:01 1064634 /lib/i386-linux-gnu/libc-2.15.so
b7716000-b7717000 ---p 001a3000 08:01 1064634 /lib/i386-linux-gnu/libc-2.15.so
b7717000-b7719000 r--p 001a3000 08:01 1064634 /lib/i386-linux-gnu/libc-2.15.so
b7719000-b771a000 rw-p 001a5000 08:01 1064634 /lib/i386-linux-gnu/libc-2.15.so
b771a000-b771d000 rw-p 00000000 00:00 0
b7731000-b7734000 r-xp 00000000 08:01 1088720 /lib/i386-linux-gnu/libSegFault.so
b7734000-b7735000 r--p 00002000 08:01 1088720 /lib/i386-linux-gnu/libSegFault.so
b7735000-b7736000 rw-p 00003000 08:01 1088720 /lib/i386-linux-gnu/libSegFault.so
b7736000-b7738000 rw-p 00000000 00:00 0
b7738000-b7739000 r-xp 00000000 00:00 0 [vdso]
b7739000-b7759000 r-xp 00000000 08:01 1089542 /lib/i386-linux-gnu/ld-2.15.so
b7759000-b775a000 r--p 0001f000 08:01 1089542 /lib/i386-linux-gnu/ld-2.15.so
b775a000-b775b000 rw-p 00020000 08:01 1089542 /lib/i386-linux-gnu/ld-2.15.so
bf8e4000-bf905000 rw-p 00000000 00:00 0 [stack]
[1] 11555 segmentation fault (core dumped) ./main
6.以下のコマンドを実行
addr2line -e main 0x804841c
7.ソースコードでsegmention faultが発生した位置が表示される
/xxxx/xxxx/xxxx/segmentation-fault/main.c:8