地址模式
符号化中最常见的困惑来源就是一个地址究竟意味着什么。atosl 会根据你传入的标志来解释每个输入地址。
查找地址(lookup address)
在内部,每一次符号化都会解析一个静态链接期 VM 地址——即记录在 DWARF 行表(line table)和符号表中的地址(对于典型的 arm64 可执行文件,这些地址从 0x100000000 开始)。这些标志决定了你的输入如何被转换为该查找地址。
| 模式 | 标志 | 查找地址 | 典型用途 |
|---|---|---|---|
| 加载地址(默认) | -l <load> |
address − load_address + __TEXT vmaddr |
来自崩溃报告的运行时/虚拟地址 |
等价于 atos -offset |
-l 0 <off> |
off + __TEXT vmaddr |
相对于镜像 __TEXT 基址的文件偏移 |
文件偏移(旧式 -f) |
-f -l <load> |
address − load_address |
跳过 __TEXT 重定基的向后兼容模式 |
默认模式:运行时地址
这是你处理崩溃报告时所使用的模式。你需要传入镜像被映射到的加载地址,以及崩溃记录下的运行时地址。
atosl -o MyApp.app.dSYM -l 0x104f80000 0x104f81234
atosl 会计算 0x104f81234 − 0x104f80000 + __TEXT vmaddr 并解析该结果。如果镜像没有发生滑动,则加载地址等于 __TEXT vmaddr(通常是 0x100000000),此时运行时地址本身就是静态地址。
我从哪里获取加载地址?
从崩溃报告的 Binary Images 部分获取。每一行看起来像这样:
0x104f80000 - 0x104fa3fff MyApp arm64 <uuid> /path/MyApp
第一列(0x104f80000)就是要用 -l 传入的加载地址。
复现 atos -offset
Apple 的 atos -offset N 把 N 当作相对于镜像 __TEXT 基址的偏移。你可以用默认模式配合零加载地址得到完全相同的结果:
# 以下两者等价:
atos -o sample.dSYM/Contents/Resources/DWARF/sample -offset 0x328
atosl -o sample.dSYM -l 0 0x328
两者都会计算 0x328 + __TEXT vmaddr 并解析到同一个函数。不需要任何特殊标志。
-f / --file-offsets 标志
-f 是一个历史遗留的、向后兼容的模式。它直接使用 address − load_address 作为查找地址,而不加上 __TEXT vmaddr。
# 当“值减去 load”等于静态 VM 地址时可解析:
atosl -o sample.dSYM -l 0 -f 0x100000328
-f与atos -offset并不相同。 要匹配atos -offset,请使用如上所示的默认模式配合-l 0。-f保持不变,以便依赖它的现有脚本仍能正常工作。
快速决策指南
- 在符号化崩溃报告?使用默认模式,配合 Binary Images 中的加载地址。
- 手上是从镜像起始处算起的偏移(类似
atos -offset)?使用-l 0 <offset>。 - 在维护一个使用了
-f的旧脚本?它的行为与以前完全一致。