我正在尝试以稍后可以使用
addr2line
进行解码的形式存储堆栈跟踪。我通过 backtrace
获取堆栈跟踪本身,但我不知道如何将其转换为位置无关的地址。
我尝试过的解决方案:
backtrace_symbols
,正如许多教程所建议的那样。然后我得到一个像"0 MyExecutable 0x00000001004a2ba1 _Z13EventLoop_addPPvP7Event_s + 97"
这样的字符串。当我尝试将地址从“0x00000001004a2ba1”传递到 addr2line addr2line -e MyExecutable 0x00000001004a2ba1
时,它无法返回函数+行信息。只有3个有效的原因是因为ASLR。这里的答案https://stackoverflow.com/a/63856113/516813显示了如何在Linux上转换地址,但该解决方案不适用于Mac,因为
dladdr1
不存在,我找不到获取link_map的方法。有谁知道如何在 Mac 上执行此操作?
atos 工具默认包含在 macOS 上的 Xcode 中。如果您尚未安装 Xcode
xcode-select --install
有吗?
which atos
休息部分
atos -o YourProgram -l <base_addr> <absolute_addr>