直接回答
原生崩溃排查需要两类不同材料:发生故障进程的崩溃证据,以及与原生二进制完全匹配的未剥离符号。Android NDK 文档说明可以使用 ndk-stack 符号化原生调用栈,也介绍 Gradle 构建会在对应构建类型和 ABI 的 build 中间目录生成未剥离库。文件名或版本标签相同并不足够;符号不匹配时,函数名和源码位置可能有误导性。应把应用版本、提交或源码版本、ABI、原生库标识和构建变体等身份信息与符号包放在一起,只有身份匹配时才为这条崩溃取用符号。 对端侧 AI 应用而言,原生堆栈应帮助定位运行时或桥接阶段,而不能成为收集用户内容的理由。项目隐私事实说明,本地推理不需要将提示词发送到远程推理服务器,但不能证明应用没有其他网络请求。更重要的是,诊断日志不应包含提示词、转写、图片、生成文本、认证值或暴露个人姓名的绝对路径。崩溃报告与诊断包转移应由明确的产品政策和用户可见说明控制。本地推理并不意味着遥测天然安全或不存在。 在改模型文件或承诺修复之前,先分类故障。区分原生调用周围的 Kotlin/Java 异常、带 tombstone 的进程崩溃、应用无响应事件、运行时加载错误和任务级失败。将原始崩溃材料保存在受控位置,并另做脱敏分析副本。先匹配 ABI 与构建 ID,再用相应未剥离库符号化,然后结合应用阶段码将调用映射到初始化、输入转换、推理、流回调、取消或关闭。不要公开原始转储;即便堆栈也可能泄露路径、用户标识或构建基础设施信息。 测试应在不伪造真实模型故障的前提下验证证据管线。使用受控原生测试夹具或获准的崩溃复现,确认准确符号能解析预期测试帧,也确认身份不匹配的符号包会被拒绝。将发布打包与符号上传/保留作为独立运维测试。真正的模型故障只需附制品/运行时身份和不含隐私的阶段码,不应附提示词。符号化堆栈能缩小停止位置,但单凭它不能证明根因、设备不兼容或性能结论。 符号和原始崩溃数据只应在团队调查需要的期限内开放给必要人员。说明谁可以获取未剥离符号和 tombstone、符号材料如何映射到发布版本、原始转储保留多久,以及脱敏结论如何共享。本文提供的是调试流程,不声称 Cove 当前采集或发布了任何特定崩溃遥测。 构建流程应在制品生成时保存符号,而不是等到用户报告后再临时寻找。符号文件要与对应 ABI、原生库、应用构建和发布标识一起归档;如果采用拆分 ABI 或多个 native library,也需逐个记录对应关系。进行剥离、混淆、链接器或原生依赖升级后,应验证产物身份仍可追溯。诊断运行时,只用匹配材料解释地址;无法匹配时保留原始地址并标记“未符号化”,不要把近似符号结果当成确定结论。 支持流程也需避免过度收集。用户报告可以先提交崩溃类型、发生阶段、应用版本和是否可复现等字段;需要原始文件时再明确解释用途、访问者和保留期限。对外共享的示例应删除用户目录、设备标识和无关堆栈参数。把原始材料限制在少数调查者手中,再分享必要的脱敏帧和修复结论,能把定位效率与数据最小化同时纳入工程流程。
发布构建在原生模型初始化时退出
支持团队收到一个已测试安装中的崩溃报告。报告有应用构建和设备 ABI,但堆栈没有符号。团队附近有一个符号归档,却尚未确认其构建身份是否匹配。
决策
符号化前先按准确原生构建身份匹配崩溃与符号文件;原始材料严格控权,并生成排除用户内容的脱敏分析副本。
预期结果
团队可以定位运行时失败阶段,而不会依据错配堆栈误判根因、设备兼容性,也不会把提示词泄露到常规支持渠道。
需要收集的证据
只有将以下证据与同一模型文件和测试运行关联起来,结论才可复核:
- PRIVACY-01:本地推理减少向远程推理服务器发送内容的需要,但不能证明应用没有其他网络请求。
- COVE-LIFECYCLE-01:Cove ModelManager 维护显式模型生命周期状态,可用于区分加载阶段与后续任务故障。
只有记录了模型身份、构建配置、实际后端、任务样例和失败情况,运行时比较才可复核。
实施流程
Record and compare the three evidence pieces together: the app and native build identifiers, the retained symbol files, and the redacted crash fixture. Maintaining all of them in a linked form allows the recorded context to be re-examined against later entries and supports consistent symbolication.
- 采集最小且分类清楚的故障记录. 记录应用构建、系统版本、ABI、原生库/构建标识、崩溃类别和应用阶段。安全保存原始 tombstone 或获准的追踪材料;不要增加提示词、转写、媒体、凭据或个人路径字段。
- 准确匹配符号归档. 确认构建变体和 ABI,再将原生构建 ID 或其他权威制品身份与未剥离库对照。不匹配的同名归档必须拒绝。符号按发布版本索引,不要只放在会变动的 latest 目录里。
- 在受控环境完成符号化. 按照 Android NDK 官方方法使用匹配的未剥离库。先确认已知测试帧能正确解析,保留原始追踪,并区分运行时、应用桥接和系统代码;不能只看栈顶帧就推断根因。
- 共享前先脱敏. 删除或掩盖绝对路径、用户名、账号值、本地文档名称和无关进程信息。只共享调查所需的帧、阶段、构建身份和复现细节;原始转储及符号限制访问。
- 测试保留流程与错配拒绝. 用受控夹具确认正确符号可以解析,错误构建符号会被拒绝或明确告警。检查发布打包是否按政策留存所需符号,记录资料负责人,并在原生依赖或 ABI 变化后重新验证。
验收标准
- 每次符号化前均核对 ABI 与准确原生构建身份。
- 原始崩溃文件和未剥离符号有明确的访问与保留边界;共享结论已脱敏。
- 报告区分崩溃类别、执行阶段和已证明根因,不夸大为兼容或性能结论。
- 诊断结构排除提示词、转写、图片、生成文本、凭据和不必要私有路径。
决策对照表
| 维度 | 选择或证据 | 解读方式 |
|---|---|---|
| 未符号化 tombstone | 包含地址和元数据的原始崩溃证据 | 应作为源材料保留;通常不足以直接形成可维护的调用点诊断。 |
| 匹配后的符号化堆栈 | 崩溃材料加准确构建/ABI 符号 | 可映射地址到函数及可能的源码位置,仍需结合上下文分析。 |
| 附带用户内容日志 | 不应作为默认支持包 | 通常不会改善地址符号化,却增加隐私风险;优先使用阶段码和脱敏复现。 |
需要避免的失败模式
- 使用同名但构建身份不匹配的符号库,得到看似合理的错误栈。
- 把原始 tombstone、提示词或本地路径默认发给普通支持渠道。
Avoid two specific pitfalls: writing logs that capture native stacks together with prompts, and allowing release builds to lose their symbols. Limit any release-facing wording strictly to what the recorded evidence supports and do not add claims, hints, or details not covered by the preserved material.
最小复现记录
| 层级 | 记录内容 |
|---|---|
| 设备 | 厂商、型号、芯片、内存档位、操作系统版本 |
| 软件 | 应用版本和 Git 提交号 |
| 模型 | 系列、变体、版本、格式、文件长度、摘要、量化方式 |
| 运行时 | 名称、版本、请求后端及实际后端证据 |
| 工作负载 | 样例版本、输入摘要、提示词摘要、输出策略 |
| 结果 | 完成、失败、取消、回退及保护隐私的诊断信息 |
发布检查表
- ☐ 主要搜索问题已回答,且没有未经支持的数字。
- ☐ 所有模型文件和运行时版本均已固定。
- ☐ 代表性任务和失败处理策略均有说明。
- ☐ 生命周期、取消、清理和回退均已测试。
- ☐ 用户内容与网络边界均有说明。
- ☐ 结论只适用于被记录的配置。
- ☐ 新增测试结果时链接到原始方法或证据。
来源与相关证据
中文部署与排错专题见。奇连 AI 端侧专题。
常见问题
能否用任意同名库给崩溃做符号化?
不能。地址属于特定二进制构建与 ABI。必须使用匹配的未剥离符号并核验身份;邻近版本可能输出看似合理但错误的位置,应先核对构建标识。
符号化堆栈能证明模型与设备不兼容吗?
不能。它提供的是某次崩溃的执行位置证据。根因需要复现和阶段分析;设备支持主张还需要准确制品、运行时、系统与硬件的独立证据。
崩溃包应该包含触发推理的提示词吗?
默认不应包含。尽可能用合成夹具复现,并保留脱敏阶段元数据。提示词、转写、图片和生成结果可能私密,也不是把原生地址映射到符号所必需的材料。