2011-11-09 :-(
_ [Segmentation fault][SEGV][セグメンテーションフォールト]セグメンテーションフォールト
今週はバイナリアンになってるのでたまには手を動かしてみる。
CentOS で
% uname -a Linux centos.area51.gr.jp 2.6.18-238.19.1.el5 #1 SMP Fri Jul 15 07:31:24 EDT 2011 x86_64 x86_64 x86_64 GNU/Linux
binary hacks に segv を拾う手段が紹介されていた。むしろ高林哲さんとこに本と同じ記事がある 普通のやつらの下を行け: C でバックトレース表示 - bkブログ
記事と同じようにゼロ除算させてみたら Segmentation fault 扱いされなかった
% gcc segv.c && ./a.out segv.c: In function ‘foo’: segv.c:6: 警告: division by zero 浮動小数点演算例外です
のでヌルポさせてみる( ustackOnLinux - ログを取っている環境が i386だったり x86_64だったりするので、stackframeの addressの出方もまちまちだったりするが、 )
#include <stdio.h> void foo(void) { char* a = NULL; printf("%s\n", a); } int main(int ac, char** av) { foo(); return 0; }
実行
% catchsegv ./a.out *** Segmentation fault Register dump: RAX: 0000000000000000 RBX: 00002b36b1492bc0 RCX: 0000000000000000 RDX: 00007fffbd1e3dd8 RSI: 00007fffbd1e3dc8 RDI: 0000000000000000 RBP: 0000000000000000 R8 : fefefefefefefeff R9 : 00002b36b12837a0 R10: 0000000000000000 R11: 00002b36b170d190 R12: 0000000000000000 R13: 00007fffbd1e3dc0 R14: 0000000000000000 R15: 0000000000000000 RSP: 00007fffbd1e3c88 RIP: 00002b36b1723b80 EFLAGS: 00010246 CS: 0033 FS: 0000 GS: 0000 Trap: 0000000e Error: 00000004 OldMask: 00000000 CR2: 00000000 Backtrace: /lib64/libc.so.6(strlen+0x30)[0x2b36b1723b80] /lib64/libc.so.6(_IO_puts+0x1b)[0x2b36b170d1ab] ??:0(foo)[0x4004b1] ??:0(main)[0x4004c7] /lib64/libc.so.6(__libc_start_main+0xf4)[0x2b36b16c7994] ??:0(_start)[0x4003e9] Memory map: 00400000-00401000 r-xp 00000000 fd:00 326798 /home/rin/work/lang/c/a.out 00600000-00601000 rw-p 00000000 fd:00 326798 /home/rin/work/lang/c/a.out 1cb3b000-1cb60000 rw-p 1cb3b000 00:00 0 [heap] 3733c00000-3733c0d000 r-xp 00000000 fd:00 1695910 /lib64/libgcc_s-4.1.2-20080825.so.1 3733c0d000-3733e0d000 ---p 0000d000 fd:00 1695910 /lib64/libgcc_s-4.1.2-20080825.so.1 3733e0d000-3733e0e000 rw-p 0000d000 fd:00 1695910 /lib64/libgcc_s-4.1.2-20080825.so.1 2b36b1276000-2b36b1292000 r-xp 00000000 fd:00 1695621 /lib64/ld-2.5.so 2b36b1292000-2b36b1294000 rw-p 2b36b1292000 00:00 0 2b36b1492000-2b36b1493000 r--p 0001c000 fd:00 1695621 /lib64/ld-2.5.so 2b36b1493000-2b36b1494000 rw-p 0001d000 fd:00 1695621 /lib64/ld-2.5.so 2b36b1494000-2b36b1497000 r-xp 00000000 fd:00 1695625 /lib64/libSegFault.so 2b36b1497000-2b36b1697000 ---p 00003000 fd:00 1695625 /lib64/libSegFault.so 2b36b1697000-2b36b1698000 r--p 00003000 fd:00 1695625 /lib64/libSegFault.so 2b36b1698000-2b36b1699000 rw-p 00004000 fd:00 1695625 /lib64/libSegFault.so 2b36b16aa000-2b36b17f8000 r-xp 00000000 fd:00 1695620 /lib64/libc-2.5.so 2b36b17f8000-2b36b19f8000 ---p 0014e000 fd:00 1695620 /lib64/libc-2.5.so 2b36b19f8000-2b36b19fc000 r--p 0014e000 fd:00 1695620 /lib64/libc-2.5.so 2b36b19fc000-2b36b19fd000 rw-p 00152000 fd:00 1695620 /lib64/libc-2.5.so 2b36b19fd000-2b36b1a04000 rw-p 2b36b19fd000 00:00 0 7fffbd1d0000-7fffbd1e5000 rw-p 7ffffffe9000 00:00 0 [stack] 7fffbd1fc000-7fffbd200000 r-xp 7fffbd1fc000 00:00 0 [vdso] ffffffffff600000-ffffffffffe00000 ---p 00000000 00:00 0 [vsyscall]
4873112885