概述
在程序的开始加上这个
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查错误代码行号所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复