跳转至

Apple IPS 崩溃报告

inspect_apple_ips / inspect-apple-ips 用于回答以下问题:所选的一个本地 Apple .ips 文件是否为崩溃报告(bug_type 字符串 "309")、该报告记录了哪些进程、异常和终止事实、它列出了哪些线程和 usedImages 行,以及它的字符串匹配哪些文档化的崩溃类别。它在不执行目标的情况下读取文件,并且不需要 Xcode、atos、反汇编器或 pwntools。

rea inspect-apple-ips /absolute/path/to/report.ips --json

CLI 会相对于调用者的工作目录解析相对路径。MCP 要求提供绝对文件系统路径,并保留该确切选择:

{
  "name": "inspect_apple_ips",
  "arguments": { "path": "/artifacts/report.ips" }
}

观察结果

内联证据结果包含工件路径、SHA-256 和字节长度。metadata 是第一行 JSON 对象。bug_type 始终保持字符串类型。仅当该字符串为 "309" 时才解析崩溃主体。其他类型(包括 "288" 堆栈快照)不会返回崩溃结果。

process、exception、termination、faulting_thread、threads 和 images 在存在时重现文档化的主体字段。整数保留其十进制字面量和十六进制形式,包括大于 2^53 的 arm64e 寄存器。帧角色遵循记录的帧索引:已解析的故障线程的第 0 行是 faulting_instruction,其他线程的第 0 行是 current_instruction,后续行是 return_address。每个运行时地址使用该行自身的映像基址和偏移。记录的 inline 标志不提供缺失的偏移,也不允许借用另一行的地址。当 faultingThread 缺失或无法解析为已记录的线程对象时,第 0 行角色为 unknown;已记录的查找仍然可用。process.os_version 保留生产者的字典(train、build、release_type、is_embedded)或较旧的字符串形式。映像 UUID 为大写 8-4-4-4-12 格式;全零 UUID 或缺少 arch 时,值为 uuid_unknown。映像 source 字母保持其文档化的含义(P 进程、S 共享缓存、C 共享缓存库、K 内核、U 内核缓存、T 内核文本执行、A 绝对)。文档未列出的键保留在 unlisted_keys 或 unlisted_body_keys 中。

每个帧的 image_index 引用其在 images 中的条目。映像架构、UUID 和 uuid_unknown 在该映像上仅保留一次。使用这些事实时需解析引用;索引缺失或越界会使映像未知。这避免了在每个堆栈帧中重复映像文本。

一个存在但其 JSON 类型与文档化类型不同的值,绝不会被当作缺失:它会连同其路径、期望类型和观察到的类型被列在 coverage.type_mismatches 中,并且 coverage.status 变为 partial。没有 threads 或 usedImages 的崩溃主体也是 partial。格式错误的映像 UUID 字符串同样会使 coverage 变为 partial;其确切拼写保留在不匹配项的 recorded_value 中,而规范映像 UUID 仍未知。32 位十六进制数字和规范的带连字符 UUID 均可接受。未解析的线程/映像引用也会使 coverage 变为 partial。被拒绝的整数查找会将其精确的十进制字面量保留在 recorded_integer 中,包括负值和大于 uint32 的值。有效的 uint32 查找值即使引用的行不可用,也会保留在 faulting_thread 或 image_index 中。

classification 仅匹配文档化的 SIGKILL 代码(通过其规范十六进制形式进行比较)、EXC_GUARD 子类型、指针认证后缀和 dyld 缺失库字符串。不匹配这些规则中任何一条的报告为 unclassified。

打开 Mach-O 和 dSYM UUID 关联的操作仍未被观察到。报告中打印的符号名称是记录的声明,并未经过验证。Linux ELF 核心转储使用单独的 记录崩溃 工作流。

限制与失败

所选文件默认限制为 1 MiB(最大 16 MiB)。默认检查最多 256 个线程、8192 个帧、1024 个 usedImages 行和 16384 个 threadState 寄存器槽(最大分别为 4096 / 65536 / 4096 / 262144)。在解析每一行之前检查预算,报告未解释的主体成员仅做语法检查而不保留。固定配额限制 JSON 嵌套(64 层)、每个对象的未列出键名(1024 个)和 termination.reasons 条目(256 个)。格式错误的元数据、截断的崩溃主体、无效 UTF-8、文本中的 NUL 以及预算耗尽都会失败,且不产生部分成功。

max_integer_text_bytes(CLI 中的 --max-integer-text-bytes)单独限制保留的十进制和十六进制整数文本,包括每个派生的运行时地址和被拒绝的查找字面量。其默认值为 8 MiB 的 UTF-16 文本存储,最大值为 64 MiB。每次出现都会计数,即使某个对象可以在内存中共享,但会被多次序列化。解析器在数字转换或地址扩展之前预留一个保守的上限,然后在每个值之后释放未使用的预留。当同一映像基址贡献给许多帧时,它会重用已解析的源整数。

当需要更多空间时,请在下次调用时提高此每次调用的配额;无需重启。文件大小和行数预算不会提高它。此配额独立于 JSON 传输大小、MCP 响应限制和客户端的接收缓冲区。配额耗尽时报告类型化的资源错误,且不产生部分成功或截断的整数事实。

rea inspect-apple-ips /absolute/path/to/report.ips --max-integer-text-bytes 16777216 --json

此工作流不执行目标、不启动 atos,也不搜索 dSYM。

本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 rea2/rea