已合并
jscrash-analysis: SourceMap 反解前新增 UUID/构建指纹校验 #40
jscrash-analysis: SourceMap 反解前新增 UUID/构建指纹校验 #40
已合并
Vitamins创建于 15 天前
3 个文件变更+32-9
@@ -39,7 +39,8 @@ metadata:
392. SourceMap 反解门禁392. SourceMap 反解门禁
40 - 分析调用栈前先判断其是否已还原到源码。出现 `Cannot get SourceMap info, dump raw stack`、构建缓存路径、混淆函数名,或行列号无法对应源码时,视为未完成 SourceMap 反解。40 - 分析调用栈前先判断其是否已还原到源码。出现 `Cannot get SourceMap info, dump raw stack`、构建缓存路径、混淆函数名,或行列号无法对应源码时,视为未完成 SourceMap 反解。
41 - 用户提供与故障版本匹配的 `sourceMaps.json`、SourceMap 归档目录或工程构建产物时,读取 `references/sourcemap-symbolication.md`,优先使用仓库内置 `scripts/hstack/` 生成反解后的堆栈,再继续根因分析。41 - 用户提供与故障版本匹配的 `sourceMaps.json`、SourceMap 归档目录或工程构建产物时,读取 `references/sourcemap-symbolication.md`,优先使用仓库内置 `scripts/hstack/` 生成反解后的堆栈,再继续根因分析。
42- - 启用了名称混淆时,同时使用同一构建产物的 `nameCache.json` 还原方法名SourceMap、nameCache、应版本、VersionCode、product、模块和构建模式必须匹配,不得混用其他版本的映射文件42+ - 反解前必须先做 UUID / 构建指纹校验:比对故障日志中的 `Fingerprint`(构建指纹/UUID 字段)与 SourceMap 产物携带构建指纹(如 `build-info.json` 或 sourcemap 元数据 `fingerprint`)一致才允许反解;不一致时不得使该产物,按“未提供匹配 SourceMap”处理并要求补充与故障构建指纹一致的映射产物
43+ - 启用了名称混淆时,同时使用同一构建产物中的 `nameCache.json` 还原方法名。SourceMap、nameCache、应用版本、VersionCode、product、模块、构建模式和构建指纹必须匹配,不得混用不匹配版本的映射文件。
43 - 后续应用帧、源码位置和责任代码判断以反解后的堆栈为主,同时保留原始栈帧作为证据。若反解结果未产生有效应用源码帧,不得标记为反解成功。44 - 后续应用帧、源码位置和责任代码判断以反解后的堆栈为主,同时保留原始栈帧作为证据。若反解结果未产生有效应用源码帧,不得标记为反解成功。
44 - 用户未提供 SourceMap 时仍可使用 raw stack 初步分析,但必须标记“未反解”、降低源码定位可信度,并将补充匹配版本 SourceMap 后重新分析作为第一项建议。45 - 用户未提供 SourceMap 时仍可使用 raw stack 初步分析,但必须标记“未反解”、降低源码定位可信度,并将补充匹配版本 SourceMap 后重新分析作为第一项建议。
45 46 
@@ -97,8 +98,10 @@ metadata:
97- 错误信息:<Error message 原文>98- 错误信息:<Error message 原文>
98- 错误码:<Error code若有>99- 错误码:<Error code若有>
99- 页面/Ability:<page 或日志中的页面信息若有>100- 页面/Ability:<page 或日志中的页面信息若有>
100-- SourceMap 反解状态:<日志已还原 / hstack 反解成功 / 未提供映射件 / 反解>101+- 日志 Fingerprint(构建指纹/UUID):<Fingerprint ;日志缺时写“缺失”>
101-- SourceMap 输入:<sourceMaps.json / nameCache.json 所属版本和路径未提供写“未提供”>102+- UUID 校验:<一致 / 不一致 / 无法校验一致注明产物指纹与日志一致,不一致时给出两侧指纹值,无法校验时说明缺失字段>
103+- SourceMap 反解状态:<日志已还原 / hstack 反解成功 / UUID 不匹配未反解 / 未提供映射文件 / 反解失败>
104+- SourceMap 输入:<sourceMaps.json / nameCache.json 所属版本构建指纹和路径未提供时写未提供”>
102- 栈顶应用帧:<第一个应用栈帧>105- 栈顶应用帧:<第一个应用栈帧>
103- 源码位置:<反解后的文件:行:列;未反解时标记为 raw stack 位置>106- 源码位置:<反解后的文件:行:列;未反解时标记为 raw stack 位置>
104 107 
@@ -125,7 +128,7 @@ metadata:
1252. 故障模式库证据:<一级根因 -> 二级根因 -> 三级根因,必须与上方“故障模式库匹配”一致>1282. 故障模式库证据:<一级根因 -> 二级根因 -> 三级根因,必须与上方“故障模式库匹配”一致>
1263. 调用栈证据:<反解后的栈顶应用帧及关键上游帧;系统/框架帧只作为传播路径>1293. 调用栈证据:<反解后的栈顶应用帧及关键上游帧;系统/框架帧只作为传播路径>
1274. HybridStack / Native 桥接证据(如有):<NAPI、libfs、libark_jsruntime 等关键帧及其意义>1304. HybridStack / Native 桥接证据(如有):<NAPI、libfs、libark_jsruntime 等关键帧及其意义>
128-5. SourceMap 映射证据:<原始栈帧 -> 反解后源码帧;未反解时说明缺少的匹配构建产物>131+5. SourceMap 映射证据:<日志 Fingerprint 与产物指纹比对结果;原始栈帧 -> 反解后源码帧;未反解时说明缺少的匹配构建产物(版本/构建指纹)>
129 132 
130### OOM 快照分析(仅在触发 jsleak-analysis Skill 时输出)133### OOM 快照分析(仅在触发 jsleak-analysis Skill 时输出)
131- 快照输入:<rawheap / heapsnapshot 文件及其与 Crash 的时间PID进程关联>134- 快照输入:<rawheap / heapsnapshot 文件及其与 Crash 的时间PID进程关联>
@@ -8,9 +8,13 @@
8 8 
91. `node --version` 能正常运行,并使用当前系统对应的内置入口执行 `--help`:Windows 使用 `"<skill-root>\scripts\hstack\bin\hstack.bat" --help`,Linux/macOS 使用 `"<skill-root>/scripts/hstack/bin/hstack" --help`91. `node --version` 能正常运行,并使用当前系统对应的内置入口执行 `--help`:Windows 使用 `"<skill-root>\scripts\hstack\bin\hstack.bat" --help`,Linux/macOS 使用 `"<skill-root>/scripts/hstack/bin/hstack" --help`
102. SourceMap 来自故障应用的同一版本、VersionCode、product、模块和构建模式。102. SourceMap 来自故障应用的同一版本、VersionCode、product、模块和构建模式。
11-3. `sourceMaps.json` 通常位于模块构建目录的 `build/default/cache/default@CompileArkTS/esmodule/release/` 下。11+3. `sourceMaps.json` 通常位于模块构建目录的 `build/default/cache/default@CompileArkTS/esmodule/release/` 下;`hstack` 实际读取该目录下后缀为 `.map` 的映射文件
124. 启用名称混淆时,同时提供同一次构建生成的 `nameCache.json`;只需要恢复文件和行列号时可以不提供。124. 启用名称混淆时,同时提供同一次构建生成的 `nameCache.json`;只需要恢复文件和行列号时可以不提供。
135. 不覆盖原始 crash 日志,反解结果写入独立输出目录。135. 不覆盖原始 crash 日志,反解结果写入独立输出目录。
14+6. UUID / 构建指纹校验(必须):
15+ - 故障日志必须包含构建指纹/UUID 字段(faultlogger 中一般为 `Fingerprint`),SourceMap 构建产物必须携带同一次构建的指纹(例如产物目录中的 `build-info.json` 或 sourcemap 元数据 `fingerprint` 字段)。
16+ - 反解前先比对:日志 `Fingerprint` 与产物指纹一致才允许使用该产物反解;不一致时不得使用,视为“匹配版本的 SourceMap 缺失”,并要求用户补充与故障版本一致(版本、VersionCode、product、模块、构建模式、构建指纹均匹配)的映射产物。
17+ - 只有 UUID/指纹一致仍不够,还必须同时满足第 2 条(版本等字段一致);UUID 校验用于防止“同版本号但不同构建”的产物混用。
14 18 
15## 执行命令19## 执行命令
16 20 
@@ -48,13 +52,16 @@ Linux/macOS 使用:
48 52 
49## 结果校验53## 结果校验
50 54 
51-1. 对照原始栈和反解结果,确认至少个关键应用帧被还原可识别的源码文件、函数或行列号55+1. 反解前先完成 UUID / 构建指纹校验:日志 `Fingerprint`(或 UUID 字段)与产物 `build-info.json` / sourcemap 元数据的指纹必须一致,不一致的结果一律不得作证据
52-2. 使用反解后的第一个应用帧定位责任代码,同时在证据链保留对应始栈帧56+2. 对照原始栈和反解结果,确认至少一个关键应用帧被还为可识别的源码文件、函数或行列号
53-3. 反解结果为空、仍只有构建缓存路径,或行列号无法对标记为“反解失败”,优先核映射文件版本和构建模式57+3. 使用反解后的第一个用帧定位责任代码,同时在证据链保留应原始栈帧
54-4. SourceMap 版本无法确认时,不得把映射结果作为确定性根因证据58+4. 反解结果为空、仍只有构建缓存路径,或行列号无法对应源码时,标记为“反解失败”,优先核对映射文件版本、构建模式和构建指纹
59+5. SourceMap 版本无法确认时,不得把映射结果作为确定性根因证据。
55 60 
56## 降级处理61## 降级处理
57 62 
58- 内置 `hstack` 文件缺失:标记工具不完整,重新获取完整 Skill 仓库;Node.js 缺失时先安装或配置 Node.js。63- 内置 `hstack` 文件缺失:标记工具不完整,重新获取完整 Skill 仓库;Node.js 缺失时先安装或配置 Node.js。
59- 未提供 SourceMap:基于 raw stack 初步定界,源码位置可信度降低,第一项建议要求补充匹配版本的 `sourceMaps.json`64- 未提供 SourceMap:基于 raw stack 初步定界,源码位置可信度降低,第一项建议要求补充匹配版本的 `sourceMaps.json`
65+- 日志缺少 `Fingerprint`/UUID 字段或产物缺少构建指纹:无法完成 UUID 校验,标记“无法校验”,不得将映射结果作为确定性证据,并要求补充可核对指纹的产物。
66+- 日志与产物指纹不一致:标记“UUID/构建指纹不匹配”,禁止使用该产物反解;即使 hstack 能输出映射,也按“未提供匹配 SourceMap”处理,要求补充与故障构建指纹一致的产物。
60- 已启用名称混淆但缺少 `nameCache.json`:可以恢复文件和行列号,但方法名保持未还原状态,报告中必须明确说明。67- 已启用名称混淆但缺少 `nameCache.json`:可以恢复文件和行列号,但方法名保持未还原状态,报告中必须明确说明。
@@ -1,5 +1,18 @@
1# 更新日志1# 更新日志
2 2 
3+## [Unreleased] - 2026-09-02
4+ 
5+### 新增
6+- 新增 SourceMap 反解前 UUID / 构建指纹校验门禁:反解前必须比对故障日志中的 `Fingerprint`(构建指纹/UUID 字段)与 SourceMap 产物携带的构建指纹(如 `build-info.json` 或 sourcemap 元数据 `fingerprint`),一致才允许反解;不一致时不得使用该产物,按“未提供匹配 SourceMap”处理,并要求补充与故障构建指纹一致的映射产物。
7+- `references/sourcemap-symbolication.md` 新增 UUID / 构建指纹校验要求:明确日志与产物指纹的来源和比对时机,并说明指纹一致仍需同时满足版本等字段一致,用于防止“同版本号但不同构建”的产物混用。
8+- 新增两种降级处理:日志缺少 `Fingerprint`/UUID 字段或产物缺少构建指纹时标记“无法校验”,不得将映射结果作为确定性证据;日志与产物指纹不一致时标记“UUID/构建指纹不匹配”,即使 hstack 能输出映射也禁止使用该产物反解。
9+ 
10+### 变更
11+- 分析报告模板新增“日志 Fingerprint(构建指纹/UUID)”和“UUID 校验”字段;SourceMap 反解状态新增“UUID 不匹配未反解”,SourceMap 输入补充构建指纹信息。
12+- 证据链“SourceMap 映射证据”增加日志指纹与产物指纹的比对结果;未反解时说明缺少的匹配构建产物需包含构建指纹。
13+- SourceMap 匹配要求由版本、VersionCode、product、模块、构建模式扩展为同时要求构建指纹匹配,不得混用不匹配版本的映射文件。
14+- 反解结果校验将 UUID / 构建指纹校验列为前置步骤,指纹不一致的结果一律不得作为证据。
15+ 
3## [1.3.0] - 2026-09-0116## [1.3.0] - 2026-09-01
4 17 
5### 变更18### 变更