输入来源

atosl指向什么以及地址从哪里来这两方面都很灵活。本指南将两者都涵盖。

-o 接受什么

-o/--object 参数可以是以下任意一种:

输入 示例
一个可执行文件或目标文件 -o MyApp
一个 dSYM 载荷(bundle 内部的 Mach-O) -o MyApp.app.dSYM/Contents/Resources/DWARF/MyApp
一个 .dSYM bundle 目录 -o MyApp.app.dSYM
一个按 UUID/build-id 搜索的目录 -o ./symbols --uuid <UUID>

直接指向 .dSYM bundle

你不必深入 bundle 内部。传入该目录,atosl 会自动定位其中的 DWARF 载荷:

atosl -o MyApp.app.dSYM -l 0x100000000 0x100001234

按 UUID 搜索目录

如果你把许多 dSYM/二进制放在同一个文件夹中,可以让 atosl 按 UUID(或 build-id)挑选匹配的那一个:

atosl -o ./symbols -l 0x100000000 --uuid 34FBD46D4A1F3B41A0F14E57D7E25B04 0x100001234

UUID 可以带或不带连字符书写。如果没有任何匹配项,你会得到一个清晰的错误:

no binary or dSYM under ./symbols matched uuid 00000000-0000-0000-0000-000000000000

地址从哪里来

有三种方式提供地址。它们在优先级上互斥:先是命令行,其次是 --input,最后是标准输入(stdin)。

1. 在命令行上

atosl -o MyApp.app.dSYM -l 0x100000000 0x100001234 0x100004321

地址可以是十六进制(0x…)或十进制。

2. 从文件(--input

printf '0x100001234\n0x100004321\n0x100008888\n' > addrs.txt
atosl -o MyApp.app.dSYM -l 0x100000000 --input addrs.txt

地址按行读取,每行可有一个或多个,以空白字符分隔。

3. 从标准输入

当你既不提供命令行地址,也不提供 --input 时,atosl 会读取标准输入。在 textjson-lines 格式下,它会流式处理——每读到一个地址就立即打印一条结果,这非常适合管道传入一份很长的崩溃日志:

grep -o '0x[0-9a-f]\+' crash.txt | atosl -o MyApp.app.dSYM -l 0x100000000
cat addrs.txt | atosl -o MyApp.app.dSYM -l 0x100000000 --format json-lines

单文档格式(jsonjson-pretty)会收集所有结果,并在最后打印一份文档。textjson-lines 则增量式地流式输出。

下一步