简介
64位系统运行的可执行文件的符号表地址和实际运行时地址差异甚大。
譬如使用nm查看函数的地址为0x69207,但是运行时打印函数的地址为0x7FA3333F8207。
那么我们通过backtrace,手动打印,gdb,pstack获取到函数调用栈信息时,如果可执行程序是经过strip过的,打印出来将是一堆0X7F开头的大地址(0x7FA3333F8207),使用addr2line直接进行定位,显示是??:00。
原因是因为0x7FA3333F8207是动态映射的虚拟地址,该虚拟地址是通过而符号表地址(0x69207)+该代码段映射区间的地址(0x7fa33338f000)得来的。
那么我们如果要得到真正的代码位置,需要知道代码段映射地址区间,以及包含符号表信息的原始可执行程序
代码段映射地址区间
代码段映射地址区间是动态生成的,所以如果要获得真是的区间信息,必须再程序运行时通过命令
cat /proc/{pid}/smaps获取完整的映射信息。如果崩溃前没有完整的信息,那肯定就没法通过addr2line定位程序崩溃位置了。
程序运行以后,我们可以通过一下命令,获取的所有代码段映射地址区间:
cat /proc/{
pid}/smaps | grep

博客介绍了在64位系统中,可执行文件的符号表地址与运行时地址的差异,以及如何通过动态映射地址区间来定位代码位置。通过分析`/proc/pid/smaps`获取映射信息,并利用addr2line工具进行符号定位,解决strip过的程序无法直接定位的问题。举例展示了flutter运行时的映射地址段,强调了动态库地址解析在程序调试中的重要性。
最低0.47元/天 解锁文章
1458

被折叠的 条评论
为什么被折叠?



