Back to skills
SKILL.md
Hmos Apifault Analysis
ASecurity定位开发者问题。当遇到 API 调用失败或报错、错误码(如 5400xxx、801、9200 等)、crash/freeze 日志(hilog、HiviewDFX)、或需要根据日志与源码定位问题根因时使用——即使用户没明说要做诊断也应触发。输出结构化诊断报告(错误码映射 + 根因候选 + 代码修改建议)。
- 2 stars
- 0 votes
- 0 copies
- 2 views
- Added September 22, 2026
Works with
Security analysis
100/100Pro scans all 20 files and shows the line behind each finding
npx -y skills add IsKenKenYa/skills --skill hmos-apifault-analysis --agent claude-codeAre you the author of Hmos Apifault Analysis?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/iskenkenya-hmos-apifault-analysis)---
name: hmos-apifault-analysis
description: "定位开发者问题。当遇到 API 调用失败或报错、错误码(如 5400xxx、801、9200 等)、crash/freeze 日志(hilog、HiviewDFX)、或需要根据日志与源码定位问题根因时使用——即使用户没明说要做诊断也应触发。输出结构化诊断报告(错误码映射 + 根因候选 + 代码修改建议)。"
metadata:
version: 1.1.0
---
# 问题定位 Skill
帮助开发者诊断问题的 Agent Skill。接收问题描述和故障日志,通过环境发现+项目代码分析+两阶段分级诊断,输出结构化诊断报告。
## 执行承诺(无论怎么触发都要遵守)
**无论用户输入多简单——哪怕只给一个错误码或一句话描述——都必须尝试执行下方的 6 阶段流程,不要只凭训练记忆直接回答错误码含义。**
原因:同一个错误码在不同模块、不同调用方式、不同设备日志下根因可能完全不同;凭记忆给的根因经常是错的,会误导开发者。只有走「线索提取 → 模块识别 → 知识库/文档 → 源码 → 报告」才能给出靠谱结论。
**关键原则:尝试执行,而非按输入完备度跳过。** 不再按"有没有设备/有没有项目"分档跳过阶段——阶段 0、1、2、3、5、6 都要真正走一遍:
- 缺前置条件(无设备、无项目源码、无 hilogtool 等)时,**不得直接跳过该阶段**。先尝试执行该阶段的每一个步骤;当某一步确实因缺前置条件无法完成时,在报告里如实记录"该步骤未能执行 + 原因 + 对诊断置信度的影响",然后继续下一阶段。
- 缺设备/缺日志:阶段2 仍要尝试(检查用户提供的日志、尝试 hdc 连接),采集不到则记录"无法采集运行时日志,结论仅基于静态分析",并在报告置信度中体现。
- 缺项目源码:阶段5 仍要尝试(在 cwd 下 Glob/Grep 搜索),搜不到相关源码则记录"项目内未找到相关代码",并基于已有线索给出修改建议方向。
**唯一例外——阶段4(深潜分析)按置信度跳过:** 阶段4 是否执行由阶段3.3 的置信度评估决定——**高置信度跳过阶段4,低置信度执行阶段4**(保持现有机制不变)。除阶段4 外,其余阶段无论输入多简单、是否有设备/项目,都要尝试执行。
> **为什么"尝试"而非"跳过":** 跳过会让 agent 误以为某条证据链已闭合、给出过于自信的根因;而"尝试后记录缺失"能在报告里诚实暴露证据缺口,让开发者知道结论的边界(哪些是实锤、哪些是推断),这才是负责任的诊断。
唯一可以只答错误码、不跑流程的情况:用户**明确**说"只解释这个错误码/只想知道含义,不用诊断"。
## 参数
| 参数 | 必填 | 说明 |
| ------------------- | ---- | ----------------------------------------------- |
| problem_description | 是 | 开发者对问题的文字描述 |
| log_content | 否 | 故障日志原文(hilog、HiviewDFX crash/freeze等) |
| log_content_file | 否 | 日志文件路径(当日志较长时优先于log_content) |
| code_snippet | 否 | 相关代码片段 |
## 参考文件
- `references/log_patterns.md` - 日志解析模式(HiviewDFX 格式、字段含义、提取规则)
- `references/module_mapping.md` - 模块映射表(错误码/DOMAIN/.so/API→模块,含代码仓/文档仓URL)
- `references/platform_config.md` - 平台配置速查表(命令映射、路径规则、SDK提取)
- `references/tool_mapping.md` - 工具映射(CodeGenie↔终端Agent 工具名、降级方案W/E)
- `references/execution_rules.md` - 细节查阅(脚本输出JSON字段、hilogtool候选路径、媒体分析矩阵、子Agent返回契约等),非工作流重述
- `references/report_template.md` - 结构化诊断报告模板
- `references/knowledge/{module_name}/` - 知识库(error_codes.json、api_chain.json、common_issues.md等)
- `references/scripts/` - 辅助脚本(hilog_collector.py、media_file_analyzer.py)
**工具名映射:** 见`references/tool_mapping.md`。下文统一用CodeGenie的`builtin_*`工具名描述;终端Agent执行时按该表替换。
## 执行流程(6阶段)
### 阶段0:环境发现
**目标:** 探测宿主平台与运行环境,确定项目根目录、SDK路径,发现hilogtool,创建输出目录。
**执行步骤:**
1. **平台探测:** 按下表探测OS和Shell,记录host_os、host_shell、py_cmd
```
OS探测: python3 -c "import platform; print(platform.system())"
└ 失败改python,输出Windows→host_os=windows, Darwin→host_os=macos
Shell探测: uname -s
└ 退出码0→host_shell=bash, 非0→host_shell=powershell
```
2. **确定项目根目录:** 当前工作目录即为项目根目录。读取`local.properties`提取`sdk.dir=`获取SDK路径(备用:`build-profile.json5`)。
3. **创建输出目录:** 按host_shell分支(见`platform_config.md`表2)创建`diagnosis/`目录。
4. **发现hilogtool(必须执行):** 在SDK路径下查找(见`platform_config.md`表3),记录hilogtool_path。**这是阶段2 步骤A 解码日志的前提**——没有 hilogtool,脚本只能 gzip 降级、日志含乱码,错误码/domain/crash 标记无法提取,根因分析失效。必须认真搜索两个候选路径;只有确实都不存在时才记 null(并在报告中注明降级),不得图省事直接跳过。
5. **记录路径:** host_os、host_shell、py_cmd、project_root、sdk_path、hilogtool_path、output_dir。
---
### 阶段1:线索提取与模块识别
**目标:** 从输入中提取所有可用线索,识别涉及的模块。
**步骤1:解析输入(按优先级)**
- 有`log_content_file`:Read文件→按`log_patterns.md`解析
- 有`log_content`:直接按`log_patterns.md`解析
- 有`problem_description`:提取错误码、API名称、功能关键词
- 有`code_snippet`:提取API调用和错误处理逻辑
**步骤2:模块识别** 读取`module_mapping.md`,用提取的线索匹配(按优先级:错误码前缀 > DOMAIN标识 > .so库名 > API名称前缀 > hilog domain_id)。
**步骤3:Kit名推断**
- 错误码前缀匹配成功 → 从表1"Kit名"列提取
- 模块名识别成功 → 用模块名反查表1"Kit名"列
- 记录到`clues.kit_names`
**步骤4:线索汇总**
```json
clues = {
error_codes: [], event_names: [], domains: [],
call_stack_highlights: [], so_libraries: [],
modules: [], api_names: [], hilog_domain_ids: [], kit_names: [],
state_transitions: [] // 日志分析后添加
}
```
---
### 阶段2:日志采集与解析
**目标:** 采集设备日志(落盘 + 内存缓冲区)、解析、做相关性检查与状态机追踪,为后续诊断提供证据。
**强制执行:** ⚠️ **日志是诊断核心依据,必须执行。除非用户明确要求跳过,否则不得省略。** 若无设备且无用户日志,见开头「执行承诺」——注明后继续后续阶段,不阻塞。
⚠️ **采集工具约束:** 所有日志采集(步骤A 的 `hilog_collector.py`、步骤C 的 `hilog -x`)必须通过 execute_command 执行本 skill 规定的命令,**禁止用 agent 自带的日志采集工具替代**。脚本负责:①用 hilogtool+字典解码二进制 hilog(否则乱码);②产出 JSON `status` 驱动步骤B/C 分支;③产出 `parsed_files` 供相关性检查。自带工具做不到这三点,且会让 agent 误以为"采集完成"而跳过脚本,导致后续无文本可分析。
**优先级1 - 用户提供的日志(入口线索):** 若有`log_content`或`log_content_file`,先按`log_patterns.md`解析作为入口线索。但用户粘贴的静态日志可能不全或非当前复现——**若相关性检查未命中`clues.error_codes`和`clues.api_names`(即没提取到关键线索),降级到优先级2 用 hdc 补采集(步骤A/C)**,避免漏掉设备上的当前错误。
**优先级2 - hdc读取设备落盘日志:**
**步骤A - 使用脚本采集:**
```bash
{py_cmd} "{skill_dir}/references/scripts/hilog_collector.py" \
--output-dir diagnosis \
{若hilogtool_path非null则添加: --hilogtool "{hilogtool_path}"} \
--time-window 10
```
**脚本输出status处理:**
- `success`:执行步骤C采集内存缓冲区,再进入相关性检查
- `partial`:注明"日志采集部分超时/不完整"后执行步骤C,再继续分析parsed_files
- `no_logs`:进入步骤B开启落盘(不执行步骤C)
- `no_device/error`:注明"hdc日志采集失败"后继续后续阶段(不执行步骤C)
**步骤C - 采集内存中未落盘日志(步骤A未进入步骤B时执行):**
当步骤A status 为 `success`/`partial` 时执行(设备可达、已拿到落盘日志)。落盘日志有滞后,最新错误可能仍在内存缓冲区未刷盘,用 `hilog -x` 一次性全量转储内存缓冲区(不做级别过滤,避免漏掉 Warning 铺垫或任何级别线索,由相关性检查再筛):
```bash
hdc shell "hilog -x"
```
将输出保存到 `diagnosis/mem_buffer_<时间戳>.txt`。输出超过 5M(参照步骤B 的 `-l 5M`)时只保留**最近 5M**——`hilog -x` 按时间从旧到新输出,最新未落盘的错误在缓冲区末尾,取尾部:
- bash:`hdc shell hilog -x | tail -c 5M > diagnosis/mem_buffer_<时间戳>.txt`
- powershell:对应重定向写法见 `platform_config.md §2`
(可选:按 `clues` 用 `-D <domain>` / `-T <tag>` 进一步定位。)
生成的 `mem_buffer_*.txt` 与步骤A 的 `parsed_files` 合并,一起进入下面的相关性检查与后续分析。
**问题相关性检查:** 按步骤A 的 `parsed_files`(从旧到新)+ 步骤C 的 `mem_buffer_*.txt` 读取日志,检查:
1. 精确匹配:搜索clues.error_codes、clues.api_names、clues.so_libraries、clues.domains
2. 模糊匹配:在hilog Error/Fatal行搜索problem_description关键词
3. 崩溃标记:检查"Generated by HiviewDFX@OpenHarmony"
**步骤B - 无落盘日志时开启落盘:**
```bash
# 1. 开启落盘
hdc shell "hilog -w start -f diag -l 5M -n 10 -m zlib -j 11"
# 2. 中断执行,输出提示
> 日志落盘已开启。请在设备上操作触发错误,完成后回复 **"OK"** 继续诊断。
# 3. 用户回复"OK"后停止落盘
hdc shell "hilog -w stop -j 11"
# 4. 重新执行步骤A(重跑后直接进入相关性检查,跳过步骤C——落盘已捕获复现的错误)
```
**状态机转换序列追踪** 当日志中包含stateChange/reset/stop/prepare等状态事件时:
1. 按时间轴排列所有状态转换事件
2. 计数关键操作调用次数
3. 标记异常状态转换
4. 记录到`clues.state_transitions`
---
### 阶段3:分诊查询
**目标:** 快速查询知识库和文档,评估是否可直接诊断或需深潜。
> 即使错误码看起来已知,也要查知识库——模块特定的 `error_codes.json` 含精确含义/常见原因/修复提示,是训练记忆里没有的;跳过这步给的根因多半是泛泛而谈。
#### 3.1 知识库查询(模块已识别时执行)
**步骤1 - 错误码精确匹配:** Read `references/knowledge/{module_name}/error_codes.json`,按错误码查找。
**步骤2 - API调用链匹配:** Read `references/knowledge/{module_name}/api_chain.json`,按API名称查找。
**步骤3 - 故障案例匹配(强制执行):** 若`clues.kit_names`非空,对每个KitName查找案例:
```bash
# 列举fault-cases目录(用{skill_dir}absolute path!)
bash: ls "{skill_dir}/references/knowledge/fault-cases/"
powershell: Get-ChildItem "{skill_dir}/references/knowledge/fault-cases/" -Name
# 筛选文件名:{KitName}-Fault-Cases-*.md(忽略大小写)
# Read匹配文件的absolute path:"{skill_dir}/references/knowledge/fault-cases/{filename}"
```
⚠️ **关键陷阱:** fault-cases目录在skill内,与项目cwd相对关系不固定。必须用`{skill_dir}`absolute path,禁止裸glob。
**步骤4 - 常见问题匹配:** Read `references/knowledge/{module_name}/common_issues.md`,搜索匹配模式。
**步骤5 - 额外知识文件搜索(条件执行):** 当「模块已识别但步骤1-4不足」或「模块未识别」时,用clues关键词递归搜索整个`references/knowledge/`(同样用`{skill_dir}`absolute path)。
**步骤6 - 媒体文件分析(条件执行):** 错误码含5400103/5400106/5400102且日志涉及文件路径时:
1. 确认文件路径(用户提供→glob搜索→询问)
2. 执行脚本:`{py_cmd} "{skill_dir}/references/scripts/media_file_analyzer.py" --file "{path}" --json`
3. 解析结果并交叉验证hilog
#### 3.2 文档仓查询
1. `builtin_web_rag`查询官方文档(终端Agent见`tool_mapping.md`降级方案W)
2. `curl`获取Gitee文档:`curl -sL "https://gitee.com/openharmony/docs/raw/master/{errorcode_path}"`
3. 均未命中→在对话中说明并继续
#### 3.3 置信度评估
**高置信度(跳过阶段4):**
- 故障案例匹配成功(相同错误码+相似现象)
- 模块错误码精确匹配+知识库/文档信息充分
- 媒体文件分析确认格式不支持/损坏+错误码匹配
**低置信度(进入阶段4):**
- 仅通用错误码,无模块特定信息
- 知识库/文档信息不足
- 模块未识别
- 媒体文件正常+错误码5400103/5400106
**⚠️ 无论置信度高低,阶段5和阶段6都必须执行**(阶段5 把根因落到具体代码、阶段6 是契约化交付,省任一个报告都不完整)。
---
### 阶段4:深潜分析(仅低置信度执行)
**目标:** 深入分析代码实现和文档,构建完整证据链。
**执行方式分流:**
- **终端Agent:** 主Agent用Task工具委派子Agent执行(4.1→4.5为子Agent内部步骤),返回结构化结论
- **CodeGenie:** 无子Agent能力→主上下文内顺序执行4.1→4.5
**步骤4.1 - API链路追踪(有知识库时):** Read `api_chain.json`按调用栈C++函数名反向追踪。
**步骤4.2 - 代码仓搜索:**
1. Read `module_mapping.md`表6获取代码仓URL
2. `curl`获取Gitee源文件,搜索错误头文件
3. `builtin_glob`在SDK中搜索`.d.ts`文件
**步骤4.3 - 文档深度查询:** `builtin_web_rag`查询开发指南/FAQ + `curl`读取Gitee文档目录。
**步骤4.4 - 证据交叉验证:** 对比知识库/文档/代码仓结果,矛盾时以代码仓实现为准,按证据充分度排序根因候选。
**步骤4.5 - 根因层级追溯(阶段4 执行时必做):** ⚠️ **不停留在框架机制层,必须追溯到应用侧具体操作。** (阶段4 被高置信度跳过时本步也跳过;应用侧根因要求由阶段5 步骤4 兜底,仍始终生效。)
追溯规则:
1. 框架防御性代码本身不是bug,不应作为最终根因
2. 最终根因必须是应用侧具体操作
3. 在证据链中区分"拦截机制"和"触发行为"
4. 结合阶段2状态转换时间线确认异常操作
示例追溯链:
```
现象:seekDone回调未送达
<- 框架拦截:isloaded_==false
<- 触发原因:ResetTask()被调用
<- 应用侧操作:多次调用reset()
<- 真正根因:开发者未正确管理播放器状态
```
---
### 阶段5:项目源码分析(始终执行)
**目标:** 分析项目源码,定位具体代码问题并给出修改建议。
**步骤1:扫描源码文件** Glob搜索:`**/*.ets`、`**/*.ts`、`**/*.c`、`**/*.cpp`、`**/*.h`
**步骤2:读取项目配置**
- Read `entry/src/main/module.json5`(权限声明)
- Read `build-profile.json5`(SDK版本)
**步骤3:定位问题相关源码** Grep搜索API名称/问题模式/C++函数名,Read相关代码段。
**步骤4:源码问题分析**
- API调用时序是否正确(对照api_chain.json)
- 权限声明是否完整(对照module.json5与API要求)
- 语法检查(`builtin_check_editor_errors`或降级方案E)
- 结合诊断结论定位错误用法
- **确保rank-1 根因表述为应用侧具体操作**
**步骤5:生成修改建议** 针对定位的问题给出可直接应用的代码修改方案。
**步骤6:汇总结果** 记录到报告"项目上下文"章节。
---
### 阶段6:结果输出(始终执行)
**目标:** 构建结构化诊断报告并写入文件。
**步骤1:获取时间戳**
```bash
bash: date +%Y%m%d_%H%M%S
powershell: Get-Date -Format 'yyyyMMdd_HHmmss'
```
**步骤2:写入报告** Write到`diagnosis/diagnosis_{timestamp}.md`,严格遵循`references/report_template.md`模板、诊断置信度标准与关键要求——以保证报告字段一致、下游可程序化解析。
**关键要求:**
- 阶段5与阶段6无论置信度都必须执行
- rank-1 根因必须表述为应用侧具体操作
- 明确区分"框架拦截机制"与"应用侧触发行为"
---
## 重要提示
1. **全流程强制执行:** 无论输入多简单、是否有设备/项目,阶段 0、1、2、3、5、6 都要尝试执行——缺前置条件时"尝试后记录缺口",绝不直接跳过(除非用户明确要求跳过)
2. **阶段4 按置信度跳过:** 阶段4(深潜分析)是唯一按置信度决定是否执行的阶段——高置信度跳过、低置信度执行(见阶段3.3),不受输入完备度影响
3. **absolute path定位:** 访问skill目录内文件时必须用`{skill_dir}`absolute path
4. **阶段5/6必须执行:** 无论置信度高低,项目源码分析和结果输出都必须执行
5. **根因层级追溯:** 最终根因必须是应用侧具体操作,不得停留在框架机制层
6. **平台命令分支:** 所有平台相关命令按host_shell选择bash或powershell分支
Files in this skill
- CHANGELOG.md
- SKILL.md
- references/execution_rules.md
- references/knowledge/accesscontrol_sandbox_manager/api_chain.json
- references/knowledge/accesscontrol_sandbox_manager/common_issues.md
- references/knowledge/accesscontrol_sandbox_manager/error_codes.json
- references/knowledge/accesscontrol_sandbox_manager/overview.md
- references/knowledge/distributeddatamgr_data_object/api_chain.json
- references/knowledge/distributeddatamgr_data_object/common_issues.md
- references/knowledge/distributeddatamgr_data_object/error_codes.json
- references/knowledge/distributeddatamgr_data_object/overview.md
- references/knowledge/distributeddatamgr_data_share/api_chain.json
- references/knowledge/distributeddatamgr_data_share/common_issues.md
- references/knowledge/distributeddatamgr_data_share/error_codes.json
- references/knowledge/distributeddatamgr_data_share/overview.md
- references/knowledge/distributeddatamgr_distributeddatamgr_cangjie_wrapper/api_chain.json
- references/knowledge/distributeddatamgr_distributeddatamgr_cangjie_wrapper/common_issues.md
- references/knowledge/distributeddatamgr_distributeddatamgr_cangjie_wrapper/error_codes.json
- references/knowledge/distributeddatamgr_distributeddatamgr_cangjie_wrapper/overview.md
- references/knowledge/distributeddatamgr_kv_store/api_chain.json
Attribution
Comments
Loading comments…
Newsletter
Get the weekly list of safe new skills, and the ones we pulled.