You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何针对Linux位置无关可执行程序(PIE)正确使用addr2line工具?

处理PIE程序调用栈地址与Windows模块地址的调试方法

Linux下为PIE程序使用addr2line转换调用栈地址

位置无关可执行程序(PIE)加载时会被分配随机的内存基地址,调用栈里的原始地址是虚拟内存地址(VMA),必须先转换为相对虚拟地址(RVA)才能用addr2line解析:

  • 获取程序加载基地址:
    1. 找到目标进程的PID,执行cat /proc/<pid>/maps,找到对应可执行文件的内存映射行,取第一列的起始地址(例如55a1b3c00000-55a1b3c21000中的55a1b3c00000)。
    2. 也可以用gdb附加进程后,执行info proc mappings查看加载基地址。
  • 计算相对虚拟地址(RVA):用调用栈里的原始地址减去基地址,得到RVA(例如原始地址55a1b3c01456,基地址55a1b3c00000,RVA为0x1456)。
  • 调用addr2line解析:指定可执行文件并传入RVA,确保编译程序时加了-g调试参数:
    addr2line -e ./your_pie_executable 0x1456
    

Windows下对应地址转换方法

Windows中调试带.pdb符号的程序时:

  • 先通过调试工具(如Windbg、Process Explorer)获取目标模块的加载基地址。
  • 将调用栈中的原始地址减去模块基地址,得到的相对地址即可直接被.pdb文件识别,之后用调试工具(比如Windbg的ln命令)就能定位到对应的代码行。

内容的提问来源于stack exchange,提问作者Myria

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 18:12:02