如何在 Mac 上转换堆栈跟踪/地址以便可以使用 addr2line?

问题描述 投票:0回答:1

我正在尝试以稍后可以使用

addr2line
进行解码的形式存储堆栈跟踪。我通过
backtrace
获取堆栈跟踪本身,但我不知道如何将其转换为位置无关的地址。

我尝试过的解决方案:

  1. 我尝试将其传递到
    backtrace_symbols
    ,正如许多教程所建议的那样。然后我得到一个像
    "0   MyExecutable   0x00000001004a2ba1 _Z13EventLoop_addPPvP7Event_s + 97"
    这样的字符串。当我尝试将地址从“0x00000001004a2ba1”传递到 addr2line
    addr2line -e MyExecutable 0x00000001004a2ba1
    时,它无法返回函数+行信息。
  2. 使用与上面相同的地址和atos传递可执行文件
  3. 使用与 1 相同的地址和 atos 并传递 processId 而不是可执行文件。

只有3个有效的原因是因为ASLR。这里的答案https://stackoverflow.com/a/63856113/516813显示了如何在Linux上转换地址,但该解决方案不适用于Mac,因为

dladdr1
不存在,我找不到获取link_map的方法。有谁知道如何在 Mac 上执行此操作?

c++ c macos debugging addr2line
1个回答
0
投票

atos 工具默认包含在 macOS 上的 Xcode 中。如果您尚未安装 Xcode

xcode-select --install

有吗?

which atos

休息部分

atos -o YourProgram -l <base_addr> <absolute_addr>
© www.soinside.com 2019 - 2024. All rights reserved.