段错误查找记录2(三)

2014-11-24 01:44:11 · 作者: · 浏览: 7
dr.so
addr: main.cpp $(OBJLIB)
$(CC) -rdynamic -I./ $(CPPFLAGS) -L./ -laddr -lpthread -L/usr/local/lib -lunwind -o $@ main.cpp
$(OBJLIB):addr.cpp
$(CC) -rdynamic -I./ $(CPPFLAGS) -fpic -shared -lpthread -o $@ $<
.PHONY: clean
clean:
rm -f addr $(OBJLIB)
程序采用多线程
ulimit -c 0 (当前shell 中不产生core文件)
第一步将main.cpp 中sigaction(SIGSEGV, &act, NULL); 注释, 这样段错误就会在内核日志产生相应信息
编译生成 addr、libaddr.so
运行./addr
程序打印:
[cpp]
name=libaddr.so (6 segments)
header 0: address= 0xa24000
header 1: address= 0xa25000
header 2: address= 0xa25018
header 3: address= 0xa240f4
header 4: address= 0xa24df4
header 5: address= 0xa24000
输入0:
程序段错误结束
grep segfault /var/log/messages 查看
addr[22500]: segfault at 0 ip 00a24a21 sp b7724350 error 6 in libaddr.so[a24000+1000]
程序加载的基地址是0xa24000, crash 发生在进程调用的libaddr.so中
算偏移地址: 0x00a24a21 - 0xa24000 = 0xa21
一: addr2line -e libaddr.so 0xa21
二: objdump -DCl libaddr.so >dump
grep a21 dump 即可找到段错误发生位置
a19: 75 0b jne a26
/mnt/hgfs/D/code/vm_proj_saving/myproj/addr2line/addr.cpp:19
a1b: 8b 45 f0
mov -0x10(%ebp),%eax
a1e: 8b 40 54
mov 0x54(%eax),%eax
a21: c6 00 01
movb $0x1,(%eax)
a24: eb 76 jmp a9c
错误发生在addr.cpp 19行
至于捕捉段错误信号将main.cpp 中sigaction(SIGSEGV, &act, NULL);注释去掉
分别act.sa_sigaction 分别赋值sigaction_handler和sigaction_handler1 编译运行体验一下
(注意一旦程序有捕捉这个信号了, 内核日志就不会在打印相印的错误信息了)
这里已sigaction_handler示例
编译运行:
./addr
打印动态库加载信息:
name=libaddr.so (6 segments)
header 0: address= 0xe22000
header 1: address= 0xe23000
header 2: address= 0xe23018
header 3: address= 0xe220f4
header 4: address= 0xe22df4
header 5: address= 0xe22000
输入0
程序段错误打印如下然后结束:
./addr(_Z17sigaction_handleriP7siginfoPv+0x1f)[0x8048ba3]
[0xf7440c]
/lib/libc.so.6[0x6a0b5f]
/lib/libc.so.6(_IO_vfprintf+0x3a6f)[0x66b49f]
/lib/libc.so.6(_IO_printf+0x30)[0x672470]
libaddr.so(_Z10thread_allPv+0xc9)[0xe22a79]
/lib/libpthread.so.0[0x7cda49]
/lib/libc.so.6(clone+0x5e)[0x709aae]
the err addr:0x2
0xf7440c
0x672470
libaddr.so(_Z10thread_allPv+0xc9)[0xe22a79] 指令地址0xe22a79
偏移地址: e22a79 - e22000 = a79
addr2line -e libaddr.so a79
得/mnt/hgfs/D/code/vm_proj_saving/myproj/addr2line/addr.cpp:25