ARTICLE DETAIL

资讯详情

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

CANN Runtime 错误码 EE1020(Invalid Argument)深度解析:标准库函数失败(memcpy_s)的报错原理与定位方法

CANN Runtime 错误码 EE1020(Invalid Argument)深度解析:标准库函数失败(memcpy_s)的报错原理与定位方法 CANN Runtime 错误码 EE1020Invalid Argument深度解析标准库函数失败memcpy_s的报错原理与定位方法【免费下载链接】runtime本项目提供CANN运行时组件和维测功能组件。项目地址: https://gitcode.com/cann/runtime导读EE1020 是 CANN RuntimeRTS 系列错误码中用于标准库/C 库函数调用失败的统一报错码其核心场景是 Runtime 内部调用memcpy_s、memset_s等安全字符串/内存操作函数失败时上报。本文以 EE1020-Invalid_Argument.md 为基础结合 error_code_meta.h、error_code.json 及 api_c.cc 等源码完整解读该错误码的报错格式、各占位符含义、典型触发场景与定位方法帮助开发者在 CANN Runtime 使用中快速识别标准函数失败类错误并给出可操作的排查思路。EE1020 错误码定位与整体框架在 CANN Runtime 的错误码体系中EE 系列属于Runtime 核心层src/runtime/错误码与之相对的 EH 系列属于 ACL 对外 API 层src/acl/错误码。EE1020 的完整定义位于 src/dfx/error_manager/error_code.json 中归类为RTS Errors下的Invalid_Argument{ errClass: RTS Errors, errTitle: Invalid_Argument, ErrCode: EE1020, ErrMessage: %s failed. Reason: Standard function %s failed. [Errno %s] %s. %s, Arglist: func1, func2, ret_code, reason, extend_info, suggestion: { Possible Cause: N/A, Solution: N/A } }同时在 error_code_meta.h 的 X-Macro 错误码元数据表中定义了其消息模板与日志级别/* EE1020 - Invalid_Argument */ X(EE1020, EE1020, (func1, func2, ret_code, reason, extend_info), %s failed. Reason: Standard function %s failed. [Errno %s] %s. %s ErrorCodeEE1020.\n, DLOG_ERROR)该元数据表采用 X-Macro 统一维护DLOG_ERROR表示 EE1020 属于错误级日志错误码枚举值EE1020定义在 rt_log.h 的ErrorCode枚举中。该表的注释明确说明新增/修改错误码时只需在此表添加/修改一行体现了 Runtime 错误码的集中式管理模式。报错格式解析五个占位符的含义EE1020 的报错格式为%s failed. Reason: Standard function %s failed. [Errno %s] %s. %s按顺序五个占位符对应error_code.json中的Arglist: func1, func2, ret_code, reason, extend_info含义如下占位符参数名含义典型取值第 1 个 %sfunc1调用的接口名称或语义化函数描述rtGetStreamId、rtGetSocSpec、TaskToSqe、Constructing host function parameter SQE第 2 个 %sfunc2失败的标准函数名称memcpy_s等安全库函数第 3 个 %sret_code标准函数返回的错误码errno1Operation not permitted、22Invalid argument第 4 个 %sreasonstrerror翻译后的报错原因Operation not permitted、Invalid argument第 5 个 %sextend_info扩展信息调用参数、缓冲区地址、长度等srcsocName, dest3257281401236631602, dest_max1223, count1222.文档给出的报错示例如下rtGetStreamId failed. Reason: Standard function memcpy_s failed. [Errno 1] Operation not permitted. srcsocName, dest3257281401236631602, dest_max1223, count1222.解读该示例rtGetStreamId接口调用标准函数memcpy_s失败返回 errno 为 1对应Operation not permitted扩展信息中srcsocName表示源缓冲区内容此处打印的是字符串内容dest3257281401236631602为目标缓冲区地址十进制dest_max1223为目标缓冲区容量count1222为本次欲拷贝的字节数。可见 EE1020 的扩展信息会完整呈现memcpy_s的入参是定位为什么拷贝失败的关键线索。源码级触发路径EE1020 在哪里产生EE1020 的触发点在源码中统一通过RT_LOG_OUTER_MSG_IMPL(ErrorCode::EE1020, ...)上报该宏在 base.hpp 中定义。从代码结构看所有触发点几乎都围绕memcpy_s等安全函数展开可归纳为几类典型场景场景一API 层参数拷贝失败外部入参相关最典型的用户可见场景出现在 api_c.cc 的rtsProfTrace中const errno_t ret memcpy_s(data, sizeof(data), userdata, static_castsize_t(length)); if (ret ! EOK) { std::stringstream ss; ss std::hex dest0x RtPtrToValue(data) , userdata0x RtPtrToValue(userdata) std::dec , destMax sizeof(data) , length length .; RT_LOG_OUTER_MSG_IMPL( ErrorCode::EE1020, __func__, memcpy_s, std::to_string(ret).c_str(), strerror(ret), ss.str().c_str()); return GetRtExtErrCodeAndSetGlobalErr(RT_ERROR_SEC_HANDLE); }此处先将length与sizeof(rtProfTraceUserData)比较length必须在(0, dataSize]区间再执行memcpy_s。若拷贝失败扩展信息以十六进制打印dest与userdata地址并返回RT_ERROR_SEC_HANDLE。用户应重点核对length参数是否超过内部结构体大小。场景二Soc 规格查询结果拷贝失败api_c_standard_soc.cc 中rtGetSocSpec在将查询结果拷入用户缓冲区时触发const errno_t rtn memcpy_s(val, maxLen, result.c_str(), result.size() 1U); if (rtn ! EOK) { std::stringstream ss; ss std::hex val0x RtPtrToValue(val) , src0x RtPtrToValue(result.c_str()) std::dec , maxLen maxLen , count (result.size() 1U) .; RT_LOG_OUTER_MSG_IMPL( ErrorCode::EE1020, __func__, memcpy_s, std::to_string(rtn).c_str(), strerror(rtn), ss.str().c_str()); return GetRtExtErrCodeAndSetGlobalErr(RT_ERROR_INVALID_VALUE); }该函数此前已通过COND_RETURN_EXT_ERRCODE_AND_MSG_OUTER_WITH_PARAM校验maxLen需大于查询结果长度因此正常情况下不会失败一旦出现 EE1020需要怀疑输出缓冲区val指向非法地址或maxLen被并发修改。场景三内核启动参数配置拷贝失败api_c.cc 的rtConfigureCall在配置 SM 描述符时ret memcpy_s(launchArg.smDesc, sizeof(launchArg.smDesc), smDesc, sizeof(launchArg.smDesc)); if (ret ! EOK) { std::stringstream ss; ss std::hex dest0x RtPtrToValue(launchArg.smDesc) , smDesc0x RtPtrToValue(smDesc) std::dec , destMax sizeof(launchArg.smDesc) , count sizeof(launchArg.smDesc) .; RT_LOG_OUTER_MSG_IMPL( ErrorCode::EE1020, __func__, memcpy_s, std::to_string(ret).c_str(), strerror(ret), ss.str().c_str()); return GetRtExtErrCodeAndSetGlobalErr(RT_ERROR_SEC_HANDLE); }这类失败通常意味着调用方传入的smDesc指针指向非法内存如野指针、已释放内存需要检查内核启动参数描述符的生命周期管理。场景四Host 函数参数 SQE 构造失败task_to_sqe.cc 中ConstructHostFuncParamSqe将任务参数构造进 SQE 时触发const errno_t ret memcpy_s(taskInput-dataBuffer, bufferLen, paramBufDesc.bufInfo, paramBufDesc.bufSize); if (ret ! EOK) { std::stringstream ss; ss std::hex dest0x RtPtrToValue(taskInput-dataBuffer) , src0x RtPtrToValue(paramBufDesc.bufInfo) std::dec , destMax bufferLen , count paramBufDesc.bufSize .; RT_LOG_OUTER_MSG_IMPL( ErrorCode::EE1020, Constructing host function parameter SQE, memcpy_s, std::to_string(ret).c_str(), strerror(ret), ss.str().c_str()); return RT_ERROR_SEC_HANDLE; }注意此处 func1 传的是语义化描述Constructing host function parameter SQE而非函数名这与 error-code-guide.md 中func1 参数优先使用语义化描述的规范一致。函数在拷贝前已校验bufferLen paramBufDesc.bufSize因此 EE1020 的出现往往意味着dataBuffer或bufInfo指针非法。除上述四类外EE1020 还在 api_c_kernel.cc、api_impl.cc、arg_manage_ub.cc、cmo_task.cc、memory_memcpy_async_task.cc 等多处被引用均属于标准函数失败的统一出口。错误码使用规范EE1020 与其他码的区分根据 Runtime 错误码使用规范 error-code-guide.mdEE1020 属于其他 · 标准函数失败分类与输入参数非法类错误码EE1003、EE1004、EE1011、EE1012、EE1017、EE1022有明确分工后者用于用户传入的参数值非法而 EE1020 专用于Runtime 内部标准库函数如memcpy_s执行失败。与 EE1020 对应的还有 ACL 层的EH0013src/acl/层标准函数失败两者的消息模板完全一致仅分层不同——src/runtime/下的代码使用 EE1020src/acl/下的代码使用 EH0013。使用 EE1020 时还须遵守规范中的关键要求若参数是用户传入extend_info 应打印外部入参的参数名及对应的值或地址而非仅打印默认的src、dst等地址打印使用十六进制格式源码中统一用std::hexRtPtrToValue实现func1 参数优先使用语义化描述便于用户直接理解失败的操作上下文。解决方法按报错信息逐段定位文档给出的解决方法是按照报错提示定位问题结合上述源码分析可将其细化为一套可操作的排查流程看 func1接口名/功能描述确定是哪个 API 或内部功能流程失败例如rtGetStreamId、rtsProfTrace、rtConfigureCall等据此判断失败发生在用户侧还是 Runtime 内部任务构造侧。看 func2 与 ret_code标准函数与 errno确认失败的库函数。以memcpy_s为例errno 为 1EPERMOperation not permitted时多指向指针权限/生命周期异常errno 为 22EINVALInvalid argument时多指向参数非法如count超过destMax、源/目标重叠等errno 为 34ERANGE则与缓冲区容量不足相关。可通过strerror语义反推参数层面的缺陷。看 extend_info扩展信息这是最关键的一步。逐一核对src/src0x...源地址、dest/dest0x...目标地址、dest_max目标缓冲区容量、count欲拷贝字节数、length用户传入长度等字段重点检查count dest_max目标缓冲区过小检查调用方缓冲区申请大小与实际写入长度是否匹配源或目标地址异常如为 0、未对齐、已释放内存的悬垂指针检查对象的生命周期与所有权管理源与目标内存区域重叠memcpy_s对重叠拷贝的检测行为与memcpy不同需改用合适的拷贝方式。确认触发层与返回码若报错伴随RT_ERROR_SEC_HANDLE如rtsProfTrace、rtConfigureCall、ConstructHostFuncParamSqe说明是安全函数处理失败若伴随RT_ERROR_INVALID_VALUE如rtGetSocSpec说明与参数校验相关。结合返回码可进一步缩小排查范围。结合日志与调用链EE1020 通过 rt_log.h 的RecordErrorLog/PrintErrMsgToLog链路以DLOG_ERROR级别记录可通过 ASCEND_GLOBAL_LOG_LEVEL 等环境变量开启 Runtime 模块的错误日志并结合调用栈确认触发位置。若怀疑是外部入参问题重点审查传入的指针参数、长度参数若为内部任务构造阶段则更多与任务缓冲管理相关。关联资源与延伸阅读错误码索引RTS-Errors.mdEE 系列完整目录错误码元数据定义error_code_meta.h错误码 JSON 注册表error_code.json含各错误码的 ErrMessage、Arglist 与 suggestion错误码使用规范error-code-guide.mdEE/EH 分层规则、选择决策树、禁用码说明典型触发源码api_c.cc、api_c_standard_soc.cc、task_to_sqe.cc日志记录接口rt_log.h日志与调试log_ref、ASCEND_GLOBAL_LOG_LEVEL.md总结EE1020 是 CANN Runtime 面向标准库函数失败的统一错误码其报错信息本身即是一份结构化诊断报告接口名func1指明失败位置标准函数名与 errnofunc2、ret_code、reason指明失败性质扩展信息extend_info给出memcpy_s等函数的完整入参现场。掌握该错误码的格式语义、触发场景与逐字段排查方法后当应用中遇到形如rtGetStreamId failed. Reason: Standard function memcpy_s failed...的报错时即可快速锁定是目标缓冲区过小指针生命周期异常还是外部入参超限从而精准修复缩短问题定位时间。【免费下载链接】runtime本项目提供CANN运行时组件和维测功能组件。项目地址: https://gitcode.com/cann/runtime创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表