
CANNAscend人工智能任务调度【免费下载链接】runtime本项目提供CANN运行时组件和维测功能组件。项目地址https://gitcode.com/cann/runtime点击查看免费下载本篇技术指南聚焦 CANN 运行时runtime中 ACLASCENDCL侧的EH0009 Invalid_Argument错误码系统讲解其错误信息的标准格式与占位符含义、真实的报错场景以acltdtGetDataItem为例、源码层的生成链路以及检查参数范围 检查调用关系两步骤排查方法。读完本篇你将能够快速识别 EH0009 报错中的关键信息结合 host 日志定位到具体接口与非法参数并在 TDT 通道、内存复制、流管理等典型场景中完成问题闭环。EH0009 错误码概述EH0009属于 ACL Errors错误分类ACL Errors下的Invalid_Argument错误子类用于表示接口调用时传入的参数值本身不合法而非参数为空指针、路径不存在等其他参数类错误。它在 src/dfx/error_manager/error_code.json 中正式注册其关键元数据如下元数据项值errClassACL ErrorserrTitleInvalid_ArgumentErrCodeEH0009ErrMessage%s failed. Value %s for parameter %s is invalid. Reason: %s.Arglistfunc, value, param, reason在 ACL 的日志管理头文件 src/acl/common/log_inner.h 中EH0009 被定义为命名常量INVALID_PARAM_REASON_MSG与EH0001INVALID_PARAM_MSG、EH0002INVALID_NULL_POINTER_MSG、EH0007INVALID_VALUE_MSG、EH0012INVALID_PARAM_NO_VALUE_MSG等同属一个参数校验错误码家族但 EH0009 是其中唯一带详细 reason 说明的通用参数非法错误码报错信息的信息量最丰富。需要说明的是该错误码在当前仓库中同时用于 ACL 侧src/acl和 ADUMP 维测组件src/dfx/adump/adump/common/adump_error_manager.h两者的报错格式一致排查思路可以通用。错误信息格式解读EH0009 的报错格式固定为%s failed. Value %s for parameter %s is invalid. Reason: %s.四个占位符%s的含义依次为占位符含义取值示例第 1 个 %s报错阶段 / 报错的接口名funcacltdtGetDataItem第 2 个 %s实际传入的非法参数值value5第 3 个 %s非法参数名paramindex第 4 个 %s报错原因reasonindex 5 is greater than or equal to dataset size 10掌握这一格式是排障的第一步看到 EH0009 报错时优先从第 2、3 个占位符锁定哪个接口的哪个参数传错了再从第 4 个占位符确认违反的具体约束越界、超出范围、取值不合法等最后回到第 1 个占位符对应的接口文档核对合法取值范围。真实报错示例剖析acltdtGetDataItem原文档给出的典型报错示例如下acltdtGetDataItem failed. Value 5 for parameter index is invalid. Reason: index 5 is greater than or equal to dataset size 10.该报错来自 TDTTensor Data Transfer通道场景。结合示例仓库中的用法example/2_advanced_features/tdt_channel/0_simple_channel/main.cppacltdtGetDataItem的调用形态通常为const size_t datasetSize acltdtGetDatasetSize(dataset); // 获取 Dataset 中 DataItem 的数量 acltdtDataItem* item acltdtGetDataItem(dataset, 0); // 按下标取出第 0 个 DataItem其中index参数是取第几个数据项的下标其合法范围是[0, datasetSize)0 ≤ index datasetSize。上例中 Dataset 里只有 10 个数据项却传入了index 5之外的越界值 5即index 5大于等于dataset size 10因此触发 EH0009。从源码层面看该接口的定义位于 src/acl/acl_tdt_channel/tensor_data_transfer.cpp校验逻辑非常直白acltdtDataItem* acltdtGetDataItem(const acltdtDataset* dataset, size_t index) { ACL_REQUIRES_NOT_NULL_RET_NULL_INPUT_REPORT(dataset); if (index dataset-blobs.size()) { std::string errMsg acl::AclErrorLogManager::FormatStr( index %zu is greater than or equal to dataset size %zu, index, dataset-blobs.size()); const std::string indexVal std::to_string(index); acl::AclErrorLogManager::ReportInputError( acl::INVALID_PARAM_REASON_MSG, std::vectorconst char*({func, value, param, reason}), std::vectorconst char*({__func__, indexVal.c_str(), index, errMsg.c_str()})); return nullptr; } return dataset-blobs[index]; }这里可以提炼出两点关键事实报错原因reason由具体接口自己拼接。index %zu is greater than or equal to dataset size %zu这条 reason 是acltdtGetDataItem内部生成的说明 EH0009 的 reason 部分是接口自定义、人读友好的通常已经直接告诉了你违反了什么约束。越界访问不会导致崩溃而是返回nullptr。index越界时接口先报 EH0009随后返回空指针。因此调用方若忽略返回值检查后续对空指针的解引用会引发第二层问题这也是检查调用关系的意义所在——参见 example/2_advanced_features/tdt_channel/0_simple_channel/main.cpp 中ERROR_LOG(acltdtGetDataItem returned nullptr)的防御式写法。源码级原理EH0009 是如何生成的EH0009 的生成链路可以概括为业务代码显式上报模式即不是系统全局兜底捕获的异常而是每个接口在校验参数时主动调用的。核心链路如下接口内部完成参数合法性判断如上述index dataset-blobs.size()调用acl::AclErrorLogManager::ReportInputError(...)上报错误ReportInputError的实现位于 src/acl/common/log_inner.cpp其本质是对宏REPORT_PREDEFINED_ERR_MSG(errorCode, key, val)的封装——将错误码字符串EH0009与键值对func / value / param / reason组合交给底层日志框架格式化输出格式化模板%s failed. Value %s for parameter %s is invalid. Reason: %s.与错误码元数据一同注册在 src/dfx/error_manager/error_code.json 中Arglist字段func, value, param, reason与调用时传入的键一一对应。因此当你在代码中看到ReportInputError或REPORT_PREDEFINED_ERR_MSG配合INVALID_PARAM_REASON_MSG即EH0009出现时就意味着该处是一个 EH0009 的触发点。用同样的方式在仓库中搜索可以找到 EH0009 在 Dataset 内存类型不一致memType不统一、DataItem 校验等多个场景的触发位置。值得一提的对照是Runtime 侧src/runtime存在一条格式几乎相同但错误码不同的路径——src/runtime/core/inc/common/error_code_meta.h 中的EE1011 Invalid_Argument其消息模板同为%s failed. Value %s for parameter %s is invalid. Reason: %s.。也就是说ACL 侧看到的是EH0009而更底层的 RuntimeRTS侧对应EE1011两者是同一类参数非法问题在不同软件层的表达排障时可相互参考参见 docs/zh/error_code_ref/RTS-Errors 目录下相关文档。解决方法一检查接口的输入参数范围EH0009 的第一类触发原因是参数值超出接口约定的合法范围排查步骤如下锁定参数名从报错的第 3 个占位符确定是哪个参数如index核对合法范围到该接口的 API 参考文档中确认参数取值范围例如 TDT 通道相关接口见 docs/zh/api_ref/17-01_tensor_data_transfer.md错误码与返回码定义见 docs/zh/api_ref/22_error_reporting_APIs.md结合 reason 反推约束报错中的 reason 往往直接给出约束如index 必须小于 dataset size修正调用代码对于越界类问题典型修法是用acltdtGetDatasetSize动态获取上限后再传参或先对index做边界判断。// 修正示例先取 size再做边界判断避免越界 const size_t datasetSize acltdtGetDatasetSize(dataset); if (index datasetSize) { // 处理非法下标而不是直接传给 acltdtGetDataItem return; } acltdtDataItem* item acltdtGetDataItem(dataset, index);解决方法二检查接口的调用关系EH0009 的第二类触发原因是调用关系不满足接口前置条件。许多 ACL 接口对参数对象有隐式的前置依赖例如对象尚未初始化DataItem/Dataset 未通过acltdtCreateDataItem/acltdtCreateDataset创建即被使用状态机不满足在通道尚未创建、收发未配对时调用依赖通道状态的接口资源未就绪在错误恢复、释放之后的句柄仍被引用。以 TDT 通道的典型生命周期为例详见 example/2_advanced_features/tdt_channel/0_simple_channel/README.md正确调用顺序是创建通道acltdtCreateChannel→ 构造 DataItem 与 DatasetacltdtCreateDataItem、acltdtCreateDataset、acltdtAddDataItem→ 发送/接收 → 读取acltdtGetDatasetSize、acltdtGetDataItem→ 销毁acltdtDestroyDataItem、acltdtDestroyDataset。仓库示例 example/2_advanced_features/tdt_common_utils.h 展示了遍历 Dataset 并逐个销毁 DataItem 的规范写法先acltdtGetDatasetSize拿数量再循环acltdtGetDataItem(dataset, i)取指最后统一acltdtDestroyDataItem保证创建—使用—销毁生命周期完整。排查调用关系时应重点确认当前报错接口所需的前置对象Dataset、通道句柄等是否已完成创建与初始化其生命周期是否贯穿整个调用过程以及是否在同一上下文中使用。日志定位与配套排障手段EH0009 通过REPORT_PREDEFINED_ERR_MSG输出会同时进入 ASCENDCL 的 host 日志plog。拿到报错后建议配合以下手段缩小范围查看 host 侧运行日志日志文件位置与查看方法参见 docs/zh/log_ref/README.md 及 docs/zh/log_ref/viewing_logs_ep.md按模块ASCENDCL和时间过滤可看到报错前后的接口调用上下文关注返回值联动EH0009 往往伴随接口返回ACL_ERROR_INVALID_PARAM值为100000见 include/external/acl/acl_base_rt.h或返回空指针/无效句柄排查时可同时校验返回值对照示例工程复现仓库 example 目录下提供了大量接口的标准用法示例可在 example/2_advanced_features/tdt_channel 等目录中寻找对应场景对比自己的调用方式找出差异。小结EH0009 是 ACL 层最典型的参数值非法错误码其报错信息自带接口名、非法值、参数名与具体原因四个要素信息完整、定位直接。结合本仓库的源码实现可以确认EH0009 由各接口在校验失败时通过AclErrorLogManager::ReportInputError显式上报模板注册于 src/dfx/error_manager/error_code.json因此在任何接口文档中看到EH0009均可按照先查参数范围、再查调用关系、必要时翻 host 日志的路径完成排查。若排查后仍无法解决可收集报错时的完整 host 日志连同接口调用代码提交给技术支持进一步分析。赞分享CANNAscend人工智能任务调度【免费下载链接】runtime本项目提供CANN运行时组件和维测功能组件。项目地址https://gitcode.com/cann/runtime点击查看免费下载相关推荐CANN Runtime Dump 错误码 EP0006 深度解析Invalid_Argument 报错格式、触发场景与排查指南CANN Runtime Dump 错误码 EP0006 深度解析Invalid_Argument 报错格式、触发场景与排查指南 本文围绕 CANN RuntCANNAscend人工智能任务调度CANN Runtime EH0001 Invalid_Argument 错误码全解析格式、成因与排查指南CANN Runtime EH0001 Invalid_Argument 错误码全解析格式、成因与排查指南 导读 EH0001 是 CANN RuntimeCANNAscend人工智能任务调度CANN Runtime 错误码 EE1003 Invalid_Argument 深度解析从报错格式到源码排查实战CANN Runtime 错误码 EE1003 Invalid_Argument 深度解析从报错格式到源码排查实战 导读 EE1003 是 CANN RunCANNAscend人工智能任务调度创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考