十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

CANN Runtime 维测组件 EP0004 错误:Dump 配置文件解析失败(Failed to parse file)定位与解决指南

CANN Runtime 维测组件 EP0004 错误:Dump 配置文件解析失败(Failed to parse file)定位与解决指南 CANN Runtime 维测组件 EP0004 错误Dump 配置文件解析失败Failed to parse file定位与解决指南【免费下载链接】runtime本项目提供CANN运行时组件和维测功能组件。项目地址: https://gitcode.com/cann/runtime导读EP0004File_Operation_Error_Parse是 CANN runtime 仓库中 Dump 维测功能组件adump/msprof在解析acl.json等 Dump 配置文件时抛出的错误码报错形态为Failed to parse file %s. Reason: %s.。本文结合 error_code.json 的错误码定义与 dump_config_converter.cpp 的实际报错路径说明该错误的完整含义、触发场景、常见 Reason 解析方法以及修复步骤帮助开发者快速定位并修正 Dump 配置文件中存在的 JSON 语法或结构问题。一、错误概述1.1 错误码在错误体系中的位置EP0004 属于DUMP ErrorsDump 错误大类错误类别errTitle为File_Operation_Error_Parse即文件操作类错误——解析失败。它与同属 Dump 错误体系的 EP0001EP0008 一起覆盖了 Dump 配置从读取、解析、校验到下发过程中的各类异常场景完整错误清单见 DUMP-Errors.mdEP0001/EP0002/EP0003配置文件中的配置项缺失或取值无效Config_ErrorEP0004配置文件整体解析失败File_Operation_Error_ParseEP0005配置项之间存在冲突Config_ErrorEP0006/EP0007/EP0008参数非法、空指针、API 调用顺序错误Invalid_Argument。在仓库错误码注册表中EP0004 的定义如下见 error_code.json{ errClass: DUMP Errors, errTitle: File_Operation_Error_Parse, ErrCode: EP0004, ErrMessage: Failed to parse file %s. Reason: %s., Arglist: path,reason, suggestion: { Possible Cause: N/A, Solution: N/A } }两个占位符参数的含义为占位符参数名Arglist含义第一个%spath发生解析失败的文件路径例如/home/test_dump/acl.json第二个%sreason解析器返回的具体报错原因例如[json.exception.type_error.302] type must be array, but is string.1.2 报错时机Dump 配置文件何时被解析从源码调用链看EP0004 主要由adumpAI 数据 Dump模块在 Dump 配置转换阶段上报。adump 模块位于src/dfx/adump/负责将用户通过acl.json下发的 Dump 配置解析为内部 Dump 参数并下发到设备侧。在 dump_config_converter.cpp 的DumpConfigConverter::Convert()入口中配置解析流程如下int32_t DumpConfigConverter::Convert( DumpType dumpType, DumpConfig dumpConfig, bool needDump, DumpDfxConfig dumpDfxConfig) { nlohmann::json js; std::string errMsg; needDump false; int32_t ret JsonParser::ParseJsonFromMemory(dumpConfigData_, dumpConfigSize_, js, errMsg); if (ret ! ADUMP_SUCCESS) { REPORT_EP0004_PARSE_ERROR(Convert, errMsg, configPath_); return ADUMP_FAILED; } // ... 后续对 dump 配置项做字段类型、取值与约束校验失败时分别上报 EP0001/EP0002 等 }即Convert()首先调用JsonParser::ParseJsonFromMemory()将内存中的 Dump 配置文件如acl.json整体解析为 JSON 对象只要这一步失败就会通过REPORT_EP0004_PARSE_ERROR上报 EP0004 并返回失败而配置解析成功后对具体字段的类型、取值、约束校验失败则对应上报 EP0001EP0003、EP0005 等其它错误码。因此 EP0004 是 Dump 配置处理链路中最前置、最基础的文件不可解析类错误。1.3 上报宏的实现细节EP0004 的上报通过 adump_error_manager.h 中的内联宏完成// EP0004 Parse Error Report Macro - Inline for performance #define REPORT_EP0004_PARSE_ERROR(moduleName, reason, configPath) \ do { \ IDE_LOGE([%s] Parse failed: %s, moduleName, ADUMP_TO_CSTR(reason)); \ ADUMP_INPUT_ERROR( \ EP0004, std::vectorstd::string({path, reason}), std::vectorstd::string({configPath, reason})); \ } while (0)该宏同时做了两件事通过IDE_LOGE输出一条含模块名如Convert与解析原因的日志便于在 plog 日志中回溯调用ADUMP_INPUT_ERROR将错误码EP0004、参数名列表{path,reason}与参数值配置文件路径 解析原因注册到错误管理组件最终由错误上报链路以Failed to parse file %s. Reason: %s.的格式输出给用户。二、错误信息详解2.1 标准报错格式EP0004 的完整报错格式为Failed to parse file %s. Reason: %s.其中第一个%s为发生解析失败的文件名完整路径第二个%s为底层 JSON 解析器给出的具体原因。2.2 报错示例原文档给出的典型示例如下Failed to parse file /home/test_dump/acl.json. Reason: [json.exception.type_error.302] type must be array, but is string.这个示例直观地展示了错误的两段式结构文件/home/test_dump/acl.json即本次 Dump 使用的配置文件原因[json.exception.type_error.302] type must be array, but is string.表明解析器nlohmann/json在该文件中的某个 JSON 节点上期望得到一个数组array实际却遇到了字符串string从而抛出type_error.302异常。2.3 解析器与 Reason 的来源EP0004 的Reason直接来自 JSON 解析器。从仓库代码看adump 模块的解析封装类JsonParser基于开源库nlohmann/json实现见 json_parser.h#include nlohmann/json.hpp namespace Adx { class JsonParser { public: static int32_t ParseJsonFromMemory( const char* dumpConfigData, size_t dumpConfigSize, nlohmann::json js, std::string errMsg); ... }; }ParseJsonFromMemory将配置文件内容交给 nlohmann/json 解析解析失败时会把异常信息如e.what()写入errMsg。因此Reason中的[json.exception.xxx.xxx]前缀即 nlohmann/json 的异常类型标识常见形态包括异常类型典型含义[json.exception.parse_error.xxx]文件不符合 JSON 语法如存在多余逗号、缺少闭合括号、非法字符、注释等[json.exception.type_error.xxx]JSON 结构合法但节点类型不符如应数组却为字符串、应对象却为数字[json.exception.out_of_range.xxx]访问了不存在的数组下标或对象键[json.exception.other_error.xxx]其它解析/处理错误三、解决方法原文档给出的解决思路为需按照Reason中的提示检查并修改Dump 配置文件。具体可以按以下步骤操作3.1 读取并定位 Reason先完整记录报错中的Reason字段它是定位问题的直接线索。例如type must be array, but is string.说明问题出在某个期望为数组的配置项实际写成了字符串。结合错误信息中的文件路径如/home/test_dump/acl.json用文本编辑器或命令行工具打开该文件进行核查。3.2 逐类排查常见原因针对Reason的异常类型按如下方向排查parse_error语法错误检查文件是否为合法 JSON。注意 JSON 语法要求严格——键名必须用双引号包裹、字符串值必须用双引号、不允许尾随逗号、不允许注释//或/* */与单引号。可使用python3 -m json.tool acl.json一类工具快速校验语法并定位到具体行列。type_error类型不符找到Reason中提到的类型如 array、object、string、boolean、number对照 Dump 配置项的预期类型逐项核对。例如 Dump 列表dump list相关配置项应为数组若误写为字符串即会触发示例中的type_error.302。out_of_range越界访问检查是否引用了不存在的数组下标或配置键确认配置项名称拼写与官方字段完全一致。3.3 修改后重新下发修正配置文件后重新发起 Dump 配置下发重新运行相关应用或重新触发 Dump确认错误不再出现。若修改后仍未解决可以结合 3.4 节的日志定位方式进一步排查。3.4 结合日志进一步定位仓库实践从 adump_error_manager.h 的实现可知上报 EP0004 的同时会打印一条形如[Convert] Parse failed: reason的 IDE 日志。因此在排查时开启对应模块的日志级别Dump 配置解析日志由 adump 模块输出可通过设置 ASCEND_MODULE_LOG_LEVEL 等日志环境变量放大日志具体日志查看方法可参考 log_ref 与 env_vars 目录下文档在日志中检索Parse failed关键字找到模块名、配置文件路径与完整的解析原因结合上述步骤修正配置。3.5 与其它 Dump 错误码的区分排查时注意与同族错误码区分避免误判详见 DUMP-Errors.md 错误码索引若报错为EP0001/EP0002/EP0003... for configuration item ...说明文件本身可解析而是配置项的内容或取值不合法此时应检查对应配置项的取值与取值范围可参考 EP0001-Config_Error.md 等文档若报错为EP0005Conflict of configuration items ...说明文件可解析但多个配置项之间相互冲突只有当报错为EP0004Failed to parse file ...时才说明文件在整体 JSON 解析阶段就失败应优先检查文件本身的语法与结构。四、仓库源码佐证EP0004 的完整触发路径为了让读者更深入理解该错误下面给出仓库中与 EP0004 相关的完整证据链按代码执行顺序错误码注册error_code.json 中定义了EP0004的类目DUMP Errors、标题File_Operation_Error_Parse、报错模板与参数列表上报宏adump_error_manager.h 中REPORT_EP0004_PARSE_ERROR(moduleName, reason, configPath)将错误码与{path,reason}参数注册进错误管理组件触发点首次解析失败dump_config_converter.cpp 中Convert()在JsonParser::ParseJsonFromMemory返回值非ADUMP_SUCCESS时上报 EP0004 并返回ADUMP_FAILED触发点解析过程异常同一文件的异常处理分支dump_config_converter.cpp 附近中对dump配置项做后续字段校验如检查dumpOpSwitch、dumpDebug、dumpScene等开关字段时若发生异常也会以e.what()作为 reason 上报 EP0004解析基础json_parser.h 中的JsonParser::ParseJsonFromMemory基于 nlohmann/json 实现决定了Reason中异常描述的格式。从源码结构可以推断EP0004 之所以把path与reason作为两个独立参数建模而不是拼进一条固定字符串是为了让错误管理组件可以分别登记文件路径与解析原因从而在日志检索、错误聚合和后续自动化分析时获得结构化数据。五、总结与排查速查当在 CANN Runtime 环境adump Dump 功能中遇到 EP0004 时可按如下速查表快速处置步骤动作关键依据1记录Reason中的异常类型parse_error / type_error / out_of_range / other_error报错文本本身2定位报错文件如acl.json校验 JSON 语法文件路径在报错第一个%s中3按异常类型修复语法、类型、越界、字段拼写本文 3.2 节4日志中检索Parse failed补充定位adump_error_manager.h5区分 EP0001/EP0002/EP0003/EP0005避免误修DUMP-Errors.md一句话总结EP0004 Dump 配置文件如 acl.json在 JSON 解析阶段失败修复核心是读懂Reason、修好文件而文件语法与结构本身没问题后该错误即不会再出现若确认文件内容无误却仍报错则应转而检查日志与文件是否完整、可读并参考同族错误码文档继续排查。【免费下载链接】runtime本项目提供CANN运行时组件和维测功能组件。项目地址: https://gitcode.com/cann/runtime创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表