linux64位系统 addr2line使用

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

简介

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 
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值