addr2line 输出为?:0可能原因
addr2line工具使用时输出为??:0的问题
·
addr2line ??:0可能原因
addr2line ??:0可能原因
问题重现
- 编写一个异常程序(除零异常)
//test.c #include <stdio.h> void crash(void) { int i=0; int j=1; int k=j/i; } int main() { crash(); return 0; }
- 编译
gcc -o test -g test.c
- 运行
./test
- 查看崩溃地址
root@linx:/var/testhelper/programsymbols/root/test# dmesg -C root@linx:/var/testhelper/programsymbols/root/test# ./test Floating point exception root@linx:/var/testhelper/programsymbols/root/test# dmesg [3540868.730553] traps: test[4331] trap divide error ip:55d347e5067b sp:7ffdb3499f50 error:0 [3540868.730567] in test[55d347e50000+1000]
- 使用addr2line找出崩溃地址对应行。
如果直接按照网上大多数说的ip后面的地址即是addr2line的输入的地址参数那么…就会出现输出为??:0的问题:root@linx:/var/testhelper/programsymbols/root/test# addr2line -e test 55d347e5067b ??:0
问题解决
其实就是最后面addr2line输入的地址并非其所接受的地址,addr2line接受的地址是相对偏移地址,例如作者的测试的系统为凝思系统,它dmesg输出的ip并非是崩溃地址相对偏移地址,需要减去基地址,即
55d347e5067b-55d347e50000=00000000067b,然后再使用addr2line工具分析
root@linx:/var/testhelper/programsymbols/root/test# addr2line -e test 00000000067b
/var/testhelper/programsymbols/tes.c:8
可以看到地位到了第8行。
思考
dmesg 输出ip对应的内容不同的操作系统内核含义可能不同,centos8测试输出ip地址即为相对偏移地址可以直接传给addr2line使用。两个方面:1.addr2line接受的参数含义(相对偏移地址)2.传入的地址是否为相对偏移地址(这里是dmesg输出的ip对应地址)。
ok,还是得多思考一下。
更多推荐
已为社区贡献1条内容
所有评论(0)