根据backtrace_symbols查错误代码行号

在程序的开始加上这个

struct sigaction myAction;
myAction.sa_handler = mySigHandler;
sigemptyset(&myAction.sa_mask);
myAction.sa_flags = SA_RESTART | SA_SIGINFO;
int nRet = sigaction(SIGSEGV, &myAction, NULL); // 无效内存引用
printf("SIGSEGV : %d. \n", nRet);
nRet = sigaction(SIGABRT, &myAction, NULL); // 异常终止
printf("SIGABRT : %d. \n", nRet);
nRet = sigaction(SIGINT, &myAction, NULL);
printf("SIGINT : %d. \n", nRet);
nRet = sigaction(SIGBUS, &myAction, NULL); 
printf("SIGBUS : %d. \n", nRet);

这样程序异常退出,就会运行到mySigHandler函数,将堆栈信息写下来,

根据写下来的信息可查到出错的代码行

比如生成的crash如下:

0 ./getav.bin() [0x80646e5] 
1 [0xb77d840c] 
2 ./getav.bin(_ZN13CMySareMemory12WriteMessageESs+0x39) [0x806a8e1] 
3 ./getav.bin() [0x8067fb7] 
4 ./getav.bin(main+0x2d) [0x80686cb] 
5 /lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xf3) [0xb5765a83] 
6 ./getav.bin() [0x80641c1] 


1、查_ZN13CMySareMemory12WriteMessageESs地址:

0x806a8e1 + 0x39 = 0x806a91a

root@ubuntu:/zigsun/bin/linux/bin.debug.Linux.i686# addr2line -e getav.bin -f 0x806a91a
_ZN13CMySareMemory12WriteMessageESs
/zigsun/server/recordersvr/platPublish/Manager.h:105

这样可得到代码行号

2、查main中的行号

root@ubuntu:/zigsun/bin/linux/bin.debug.Linux.i686# addr2line -e getav.bin -f 0x8067fb7
startAsGetStreamProcess
/zigsun/server/recordersvr/platPublish/GetNetStreamUseProcess.cpp:562 (discriminator 1)



好象so要加上地址,bin不要加直接用地址就是对的

so要用

objdump -S 目标SO文件   

查函数地址

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值