我是靠谱客的博主 高大糖豆,最近开发中收集的这篇文章主要介绍根据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文件   

查函数地址

最后

以上就是高大糖豆为你收集整理的根据backtrace_symbols查错误代码行号的全部内容,希望文章能够帮你解决根据backtrace_symbols查错误代码行号所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(36)

评论列表共有 0 条评论

立即
投稿
返回
顶部