addr2line ??:0可能原因

问题重现

  1. 编写一个异常程序(除零异常)
    //test.c
    #include <stdio.h>
    void crash(void)
    {
    int i=0;
    int j=1;
    int k=j/i;
    }
    int main()
    {
     crash();
      return 0;
    }
    
  2. 编译
    gcc -o test -g test.c
    
  3. 运行
      ./test
    
  4. 查看崩溃地址
    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]
    
    
  5. 使用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,还是得多思考一下。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐