程序员在Linux下编写C/C++程序时,常常会遇到程序中止的问题,例如内存越界、无法处理的信号和除数为零等错误。这些问题可能导致程序直接中止,并留下Core文件,供程序员们解决问题。然而有时由于系统配置问题或磁盘空间限制,可能没有Core文件可供参考。这时可以使用addr2line工具来帮助程序员确定程序出错的位置。addr2line通过解析程序调试信息中的Line Number Table将编码地址转换为相应源代码位置,对于一些没有Core文件的情况下,帮助程序员解决问题。
如下是一个示例程序,func函数返回参数x除以参数y的结果。这里使用0作为除数,结果就是程序因为除以0导致错误,直接中断了:
1. #include <stdio.h>
2.
3. int func(int x, int y)
4. {
5. return x / y;
6. }
7.
8. int main()
9. {
10. int m = 10;
11. int n = 0;
12. printf("%d / %d = %d\n", m, n, func(m, n));
13. return 0;
14. }
1)使用-g参数编译代码,
$gcc -o test11 -g test.c
2)执行程序,结果程序异常中断。查看系统dmesg信息,发现系统日志的错误信息:
[5353678.766670] traps: test11[22398] trap divide error ip:40053b sp:7ffed0bae790 error:0 in test11[400000+1000]
这条信息里的ip字段后面的数字就是test11程序出错时所程序执行的位置。使用addr2line就可以将40053b 转换成出错程序的位置:
$ addr2line -e test1 400506
/home/test/test1.c:5
这里的test1.c:5指的就是test1.c的第5行
return a / b;
也正是这里出现的错误。addr2line帮助我们解决了问题。