addr2line基础示例执行失效,请问问题出在哪里?
问题排查与解决方法
以下是导致addr2line解析失败的常见原因及对应解决步骤:
1. 未处理Windows平台的加载基址偏移
Windows下PE可执行文件运行时会被加载到内存的某个基址,__cyg_profile_func_enter拿到的是内存绝对地址,但addr2line默认解析的是编译时的相对偏移地址。你需要:
- 获取程序加载基址:用gdb调试时执行
info files查看,或在插桩代码中调用Windows APIGetModuleHandle(NULL)获取当前模块基址。 - 将输出的每个函数地址减去加载基址,得到相对偏移后再传入
addr2line解析。
2. 编译参数适配错误
你的编译命令存在几个适配问题:
-rdynamic在Windows/mingw环境下作用有限,应改用-Wl,--export-all-symbols强制导出所有符号,确保函数地址可被解析。- 用
-x c强制按C语言编译.cpp文件可能破坏C符号处理,若代码实际是C,建议去掉-x c并改用g++编译。 - 调整后的编译命令示例:
g++ boost_stacktrace.cpp -finstrument-functions -Wl,--export-all-symbols -g -O0 -o boost_stacktrace.exe
3. 插桩函数地址获取错误
确认__cyg_profile_func_enter的参数使用正确:第一个参数void *this_fn是被调用函数的起始地址,需确保输出的是该值,而非栈上的返回地址或其他无关指针。
4. addr2line参数适配
Windows下mingw版本的addr2line可能需要指定--adjust-vma参数匹配加载基址,示例:
addr2line -e boost_stacktrace.exe -f -i -p --adjust-vma=0x<加载基址> < addrs.txt>
5. 调试信息不完整
部分gcc版本中-g生成的调试信息不够详细,可替换为-g3重新编译,确保符号信息完整。
内容的提问来源于stack exchange,提问作者Bob
相关产品推荐
相关产品推荐

