资讯动态

CANN Runtime 错误码 EH0014 排查指南:Invalid_Argument_Null_Pointer 空指针同时为 NULL 的成因与修复

发布时间:2026/9/19 12:45:30 来源:尧图企业网站定制
CANN Runtime 错误码 EH0014 排查指南Invalid_Argument_Null_Pointer 空指针同时为 NULL 的成因与修复【免费下载链接】runtime本项目提供CANN运行时组件和维测功能组件。项目地址: https://gitcode.com/cann/runtime导读EH0014Invalid_Argument_Null_Pointer是 CANN Runtime 在 ACLAscendCL接口层校验入参时抛出的一类参数错误专门用于描述两个及以上指针参数被同时传入 NULL的非法调用场景。本文以 EH0014-Invalid_Argument_Null_Pointer.md 为骨架结合本仓库的 error_code.json 错误注册表、log_inner.h 错误码常量定义与 kernel.cpp 源码实现讲清该错误码的报文格式、触发机制、排查方法与编码规避手段帮助开发者在遇到此类报错时快速定位并修复。一、错误码概览EH0014 在 ACL 错误体系中的位置在 CANN Runtime 的维测框架中ACL 层错误码统一以EH前缀编码全部注册在 src/dfx/error_manager/error_code.json 中。其中 EH0014 属于ACL Errors错误类下的Invalid_Argument参数非法子类其注册项如下{ errClass: ACL Errors, errTitle: Invalid_Argument_Null_Pointer, ErrCode: EH0014, ErrMessage: %s failed because %s cannot be NULL pointers at the same time., Arglist: func, param, suggestion: { Possible Cause: N/A, Solution: Try again with correct pointer arguments. } }从注册表可以提炼出该错误码的三个核心要素要素内容错误类errClassACL Errors错误标题errTitleInvalid_Argument_Null_Pointer参数非法——空指针错误码ErrCodeEH0014报文模板ErrMessage%s failed because %s cannot be NULL pointers at the same time.参数列表ArglistfuncAPI 名称、param参数名称建议Solution使用正确的指针参数重试在 src/acl/common/log_inner.h 中该错误码被定义为 ACL 内部日志系统的常量与EH0001Invalid Param、EH0002Invalid Null Pointer、EH0007Invalid Value、EH0008Null Pointer Func等同属一条输入参数校验错误族constexpr const char_t* const INVALID_PARAM_MSG EH0001; constexpr const char_t* const INVALID_NULL_POINTER_MSG EH0002; constexpr const char_t* const INVALID_VALUE_MSG EH0007; constexpr const char_t* const NULL_POINTER_FUNC_MSG EH0008; constexpr const char_t* const INVALID_PARAM_NO_VALUE_MSG EH0012; constexpr const char_t* const STANDARD_FUNC_FAILED_MSG EH0013; constexpr const char_t* const INVALID_NULL_POINTER_AT_SAME_TIME_MSG EH0014;可以看到EH0014 与 EH0002 虽然都与空指针相关但语义截然不同EH0002 表示某个指针参数本身非法为 NULL而 EH0014 专门表示多个指针参数被同时置 NULL——单看某一个参数时它可能是可选的但组合使用时要求至少一个非空。这一语义差异决定了 EH0014 的排查思路必然是检查参数间的组合关系。提示以上错误码均以 EH 前缀开头与其他模块如 HCCL 的 EI 前缀、FE 的 EJ 前缀、Dump 的 ED 前缀等区分完整错误码目录见 docs/en/error_code_ref/ACL-Errors/ACL-Errors.md。二、症状识别报错格式与真实示例2.1 标准报文格式当触发 EH0014 时应用侧日志plog会输出如下格式的错误信息%s failed because %s cannot be NULL pointers at the same time.其中两个占位符%s按顺序的含义为API 名称func被调用且校验失败的 ACL 接口名例如aclrtFunctionGetParamInfo参数名称param被判定同时为空的指针参数名可能以and连接多个参数例如paramOffset and paramSize。2.2 官方文档给出的错误示例aclrtFunctionGetParamInfo failed because paramOffset and paramSize cannot be NULL pointers at the same time.这句报文可以直译为aclrtFunctionGetParamInfo调用失败因为参数paramOffset和paramSize不能同时为 NULL 指针。2.3 从源码确认的完整触发现场在 src/acl/aclrt_impl/kernel.cpp 中可以看到该示例报错的实际产生逻辑。aclrtFunctionGetParamInfo用于查询内核函数Function中指定索引参数的偏移量与大小其实现如下aclError aclrtFunctionGetParamInfoImpl(const void* func, size_t paramIndex, size_t* paramOffset, size_t* paramSize) { ACL_LOG_INFO(start to execute aclrtFunctionGetParamInfo, paramIndex%zu., paramIndex); ACL_REQUIRES_NOT_NULL_WITH_INPUT_REPORT(func); if ((paramOffset nullptr) (paramSize nullptr)) { ACL_LOG_ERROR([Check][paramOffset,paramSize]paramOffset and paramSize cannot both be null.); acl::AclErrorLogManager::ReportInputError( acl::INVALID_NULL_POINTER_AT_SAME_TIME_MSG, {func, param}, {aclrtFunctionGetParamInfo, paramOffset and paramSize}); return ACL_ERROR_INVALID_PARAM; } ACL_REQUIRES_RTS_OK_WARN_NOT_SUPPORT( rtFunctionGetParamInfo(func, paramIndex, paramOffset, paramSize), rtFunctionGetParamInfo); ACL_LOG_INFO(successfully execute aclrtFunctionGetParamInfo.); return ACL_SUCCESS; }从这段代码可以提炼出 EH0014 报错的三个技术要点触发条件明确当paramOffset nullptr paramSize nullptr两个指针同时为 NULL时直接走错误分支不再下发到底层 Runtime返回码为ACL_ERROR_INVALID_PARAMEH0014 报错的同时接口返回的是通用的参数非法错误码EH0014 是日志中携带的错误码编号用于在 plog 中检索定位参数可二选一paramOffset与paramSize在接口语义上允许只取其一只关心偏移量或只关心大小因此单参数为空不报错只有两者同时为空才触发 EH0014。这是cannot be NULL pointers at the same time语义在代码中的直接体现。顺带一提同一个接口对func主句柄使用的是另一条ACL_REQUIRES_NOT_NULL_WITH_INPUT_REPORT(func)校验即 EH0002 一类单指针不可为空的校验两类空指针错误在同一个函数中并存体现了 CANN Runtime 参数校验的精细化分层。三、解决方案让指针参数组合合法化3.1 官方建议根据 EH0014 文档 与 error_code.json 中的 Solution 字段官方给出的处理方式为Try again with correct pointer arguments.使用正确的指针参数重试。3.2 分步排查建议针对 EH0014 错误结合代码实现可以给出更具体、可操作的排查步骤核对报文中的参数名读取 plog 中 EH0014 报错行确认是哪两个/哪些指针参数同时为空例如paramOffset and paramSize确认业务意图判断应用是否真的不需要这些输出参数——例如只关心参数偏移量、不关心大小时可只传paramOffset将paramSize置为合法指针或按接口文档要求处理若接口要求两者都必须输出则必须为两者分配有效内存检查指针初始化排查变量是否被初始化为nullptr后未赋值、或指向的对象是否已被释放悬垂指针同样可能表现为空指针场景下的未定义行为虽未必直接触发 EH0014但属于同类隐患修正后重试为缺失的指针参数传入合法的、指向已分配内存的指针后重新调用接口。3.3 编码规避建议从长期编码规范角度避免 EH0014 的最有效手段是在调用侧建立参数前置校验习惯// 错误示例两个输出指针同时为空必然触发 EH0014 size_t *paramOffset nullptr; size_t *paramSize nullptr; aclError ret aclrtFunctionGetParamInfo(func, 0, paramOffset, paramSize); // 正确示例 1按需只查询偏移量但需要提供合法的输出指针 size_t paramOffset 0; size_t paramSize 0; aclError ret aclrtFunctionGetParamInfo(func, 0, paramOffset, paramSize); // 正确示例 2只关心偏移量时可只对 offset 传有效地址 // 但必须先确认接口文档对 paramSize 的约束是否允许为 NULL size_t paramOffset 0; aclError ret aclrtFunctionGetParamInfo(func, 0, paramOffset, nullptr);需要注意二选一是否合法完全取决于各接口自身的定义。aclrtFunctionGetParamInfo在源码中允许paramSize为 NULL只要paramOffset非空但其他接口未必有同样的约定。务必以各接口的 API 参考文档 为准不能把同时为空之外的情形一概视为合法。四、原理纵深EH0014 的告警上报链路理解 EH0014 从触发到落盘的完整链路有助于在复杂系统中快速定位问题也可作为二次开发时参考的参数校验范式。4.1 三层结构从源码看EH0014 的生成遵循接口实现层 → 错误上报层 → 错误注册表的三层结构应用调用 aclrtFunctionGetParamInfo │ ▼ kernel.cpp: aclrtFunctionGetParamInfoImpl() ← 接口实现层 │ 检测 (paramOffsetnullptr)(paramSizenullptr) ▼ AclErrorLogManager::ReportInputError(EH0014, ...) ← 错误上报层src/acl/common/log_inner.h 定义常量 │ ▼ error_code.json: ErrCodeEH0014, ErrMessage模板 ← 错误注册表src/dfx/error_manager/error_code.json接口实现层以*Impl结尾的函数负责真实业务逻辑其中通过显式if判断完成组合参数校验见 kernel.cpp 第 784 行错误上报层通过acl::AclErrorLogManager::ReportInputError上报错误码常量来自 log_inner.h 中的INVALID_NULL_POINTER_AT_SAME_TIME_MSG同时配合ACL_LOG_ERROR输出一条含[Check][paramOffset,paramSize]标记的结构化日志便于在 plog 中grep检索错误注册表上报时携带的func、param两个实参最终填入 error_code.json 中 EH0014 的ErrMessage模板形成可读的完整报文。4.2 与同时为空相关的其他 ACL 接口需要说明的是aclrtFunctionGetParamInfo只是文档中给出的示例。EH0014 的通用性决定了两个指针参数同时为空的校验模式在 ACL 层多类接口中均可能出现例如内存拷贝、内核参数查询、模型信息查询等需要二选一输出参数的场景。排查时应以报错报文中的 API 名称为准对照对应接口的源码实现确认其参数约束。4.3 日志检索建议在定位 EH0014 时可在设备日志/运行日志中检索以下关键标识# 在 plog 中检索 EH0014 错误码 grep -rn EH0014 log_path # 在 plog 中检索示例接口的错误现场含参数名与 Check 标记 grep -rn cannot be NULL pointers at the same time log_path grep -rn \[Check\]\[paramOffset,paramSize\] log_path结合 如何通过plog日志定位Device侧异常 与 如何获取和解读Runtime异步错误码 两篇 FAQ可以建立错误码 → 日志 → 代码现场的完整定位路径。五、总结EH0014Invalid_Argument_Null_Pointer是 CANN Runtime ACL 层用于标识多个指针参数同时为 NULL的输入参数校验错误其核心特征可归纳如下报文含义API名 failed because 参数名 cannot be NULL pointers at the same time.触发本质接口语义上允许二选一的指针参数被同时传入空指针例如aclrtFunctionGetParamInfo的paramOffset与paramSize返回码接口返回ACL_ERROR_INVALID_PARAMEH0014 为日志中的错误码编号修复方式依据报文中的参数名补齐至少一个非空的有效指针并遵循接口文档对参数组合的约束。该错误通常意味着应用侧对输出参数的准备不完整属于最容易定位和修复的 ACL 层错误之一修正指针后重试即可无需涉及底层 Runtime 或驱动排查。在编码阶段对可选输出指针做好初始化与组合校验即可从源头避免此类报错。参考文档与源码索引错误码主文档EH0014-Invalid_Argument_Null_Pointer.md错误码目录ACL-Errors.md错误注册表src/dfx/error_manager/error_code.jsonEH0014 注册项错误码常量定义src/acl/common/log_inner.h示例接口实现src/acl/aclrt_impl/kernel.cpp关联 FAQ如何通过plog日志定位Device侧异常、如何获取和解读Runtime异步错误码【免费下载链接】runtime本项目提供CANN运行时组件和维测功能组件。项目地址: https://gitcode.com/cann/runtime创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价