CANN Runtime 错误码 E40023(Invalid Path)排查指南:文件路径校验失败的原因与解决方法
【免费下载链接】runtime本项目提供CANN运行时组件和维测功能组件。项目地址: https://gitcode.com/cann/runtime
导读
E40023(File_Operation_Error_Invalid_Path)是 CANN 图融合(TEFusion)链路中与文件路径校验强相关的错误码,当算子图融合、调试信息落盘等流程所需的目录路径无法通过真实路径(realpath)解析时会触发。本文基于 CANN Runtime 开源仓库中的错误码文档与错误上报实现,完整解析该错误码的报错格式、占位符含义、典型触发场景,并给出从定位到解决的完整排查路径,帮助开发者快速确认"路径不存在"或"访问权限不足"两类根因。
错误码概述:E40023 的身份信息
E40023 属于TEFusion Errors(图融合错误)错误类别,错误标题为File_Operation_Error_Invalid_Path,即"文件操作错误——路径无效"。在仓库的错误码注册表中可以找到它的完整定义(见 error_code.json):
{ "errClass": "TEFusion Errors", "errTitle": "File_Operation_Error_Invalid_Path", "ErrCode": "E40023", "ErrMessage": "Path %s for %s is invalid. Result: %s. Reason: %s.", "Arglist": "path,arg,result,reason", "suggestion": { "Possible Cause": "N/A", "Solution": "N/A" } }从定义可见,E40023 的核心语义是:某个功能参数(如调试目录参数)要求传入一个有效的文件系统路径,但该路径在校验时被判定为无效。完整的错误码家族索引可参考 TEFusion-Errors.md,其中与文件/目录操作相关的同类错误码还包括:
| 错误码 | 标题 | 语义 |
|---|---|---|
| E40003 | File_Operation_Error_Open | 文件打开失败 |
| E40023 | File_Operation_Error_Invalid_Path | 路径无效(本文主题) |
| W40011 | Directory_Operation_Error_Create_Failed | 目录创建失败 |
E40023 与 E40003 的区别在于:E40003 面向"文件存在但打开出错"的场景,而 E40023 面向"路径本身不可解析/不可访问"的场景,二者互为补充。
错误信息格式:四个占位符的完整语义
E40023 的报错格式固定如下:
Path %s for %s is invalid. Result: %s. Reason: %s.四个占位符%s按顺序依次为:
| 占位符位置 | 变量名(对应 Arglist) | 含义 | 示例值 |
|---|---|---|---|
| 第 1 个 | path | 被校验的文件路径 | /aaa/bbb |
| 第 2 个 | arg | 传入该路径的参数名 | --debug_dir |
| 第 3 个 | result | 校验动作的结果 | real path get failed |
| 第 4 个 | reason | 失败的具体原因 | the path does not exist or its access permission is denied |
该格式与 error_code.json 中定义的ErrMessage与Arglist严格一一对应,说明这是一条"参数模板化"的结构化错误信息:上层调用方只需按path, arg, result, reason的顺序填充四个实参,即可生成规范统一的报错文本。
报错示例逐段解读
官方文档给出的报错示例如下:
Path /aaa/bbb for --debug_dir is invalid. Result: real path get failed. Reason: the path does not exist or its access permission is denied.逐段拆解这条报错:
Path /aaa/bbb:被校验的路径是/aaa/bbb;for --debug_dir:该路径来源于--debug_dir命令行参数(调试目录配置项),说明用户通过该参数指定了一个用于存放调试信息的目录;Result: real path get failed:校验动作是调用真实路径解析(realpath,即解析符号链接并规整为绝对路径的操作),解析失败;Reason: the path does not exist or its access permission is denied:失败原因被归纳为两类——路径不存在,或当前进程对该路径没有访问权限。
也就是说,这条示例报错在传达这样一个事实:为--debug_dir传入的/aaa/bbb目录既不存在于文件系统中,或虽然存在但运行进程没有足够的访问权限,导致 realpath 解析失败。
触发场景与根因分析
根因一:路径不存在
路径不存在是最常见的触发场景,具体可细分为:
- 参数中拼写了错误的目录名或文件名(大小写、拼写错误);
- 目录尚未创建,程序期望目录"已存在"而非"自动创建";
- 路径中引用了不存在的挂载点或未挂载的磁盘目录;
- 使用了绝对路径但遗漏了路径前缀,或相对路径在进程工作目录变化后失效。
根因二:访问权限不足
即使路径真实存在,若当前进程的用户身份不满足以下任一条件,realpath 校验同样会失败:
- 对路径的各级父目录缺少
x(执行/进入)权限,导致无法"穿越"目录链; - 对目标目录缺少
r(读)或w(写)权限,无法满足后续的读写操作; - 路径受限于
chroot、容器挂载隔离、SELinux 或 AppArmor 等安全策略。
与调试目录(--debug_dir)的典型关联
从报错示例可以推断,E40023 在 TEFusion 图融合调试场景中出现频率较高:当开发者通过--debug_dir等参数指定调试信息(如融合过程 dump 文件)的输出目录时,融合框架会先对该目录执行真实路径解析与可达性校验,校验失败即抛出 E40023。因此该错误往往出现在"开启调试开关"的第一次执行阶段,而非运行中途。
排查与解决步骤
按照报错信息中的Result与Reason字段逐步排查,可快速收敛问题:
确认路径书写正确:检查
path字段中的路径是否存在拼写错误、多余空格、错误的斜杠方向,以及相对/绝对路径是否与预期一致。确认目录确实存在:在运行环境(尤其是容器、训练/推理集群环境)中执行以下命令验证:
ls -ld /aaa/bbb若提示No such file or directory,则需要先创建该目录:
mkdir -p /aaa/bbb- 确认访问权限:检查路径各级目录的权限位与属主:
ls -ld /aaa /aaa/bbb id # 查看当前运行用户的 uid/gid确保运行进程的用户对每一级父目录都拥有进入权限(x),对目标目录拥有读写权限(r/w)。
- 验证 realpath 解析结果:用与校验动作一致的方式复现解析,确认问题是否复现:
realpath /aaa/bbb若输出为空或报错,则说明路径确实无法解析;若输出正常,则需要进一步核对参数传入的上下文(例如参数是否被引号包裹、环境变量是否展开正确)。
- 修正参数并重跑:根据上述结论,将
--debug_dir(或其他报错中提到的参数)改为一个"存在且可访问"的目录后重新执行。
说明:错误码注册表中
suggestion.Possible Cause与Solution均为N/A,即官方未给出比报错文本更多的静态建议;因此排查的核心依据就是报错信息中Result与Reason两个字段本身,这也是该错误码设计为四段式格式的原因——让原因直接"可见"。
仓库实现机制:错误码如何注册与上报
理解 E40023 的底层实现,有助于开发者阅读同类错误码的上报逻辑。
1. 错误码注册表
所有 CANN Runtime 的错误码统一注册在 src/dfx/error_manager/error_code.json 中,该 JSON 文件以errClass分类、ErrCode为键组织错误定义,其中就包含本文的 E40023(位于 TEFusion Errors 分类下)。这种集中注册的设计使得错误码文本、占位符参数顺序与错误类别可以统一维护,并在编译期或运行期生成规范格式。
2. 错误上报实现
src/dfx/error_manager/error_manager.cc 是错误上报的核心实现:其通过ReportInnerErrorMessage等函数接收错误码、格式化字符串与可变参数列表,将占位符实参填充进模板后,经由日志模块(dlog_error,模块名为GE)输出到运行时日志。也就是说,E40023 这类错误码最终会同时体现在"用户可见的报错"与"运行时日志"两层,排查时除查看终端报错外,也可结合 CANN 运行日志中的[ERROR]级别日志(模块标记GE)获取更多上下文。
3. 错误码的"分类"定位
从 TEFusion-Errors.md 索引可以看到,E4 系列的其余错误码(E40001 环境变量无效、E40002 Python 版本错误、E40021 编译错误、E40022 参数无效等)共同覆盖了图融合阶段"环境检查—参数校验—文件操作—编译执行"的完整失败面,E40023 正是其中负责文件路径校验的一环。
预防建议
为避免在真实项目中反复触发 E40023,建议遵循以下实践:
- 在配置脚本中预创建目录:在执行依赖目录的程序前,先通过
mkdir -p确保目录存在; - 使用环境变量统一路径:避免在多个参数中硬编码路径,减少拼写不一致导致的无效路径;
- 区分"已存在目录"与"自动创建目录"两类参数:对要求"路径必须预先存在"的参数(如
--debug_dir),务必先确认目录就绪;对支持自动创建的目录,确认其父级路径具备写权限; - 容器/集群场景先验证挂载:在多机训练或容器化部署时,先确认相关目录已被正确挂载且对运行用户可见,再做调试目录配置;
- 关注日志中的 GE 模块错误:将运行时日志中的
[ERROR]与终端报错对照查看,可以定位到更完整的调用上下文。
总结
E40023 是 CANN 图融合(TEFusion)链路中一个语义清晰、易于定位的文件路径校验错误码。它的四段式报错格式(路径、参数名、结果、原因)将根因直接暴露在报错文本中,开发者只需对照Result: real path get failed与Reason字段,按"路径不存在 → 权限不足"的顺序排查,即可在大多数场景下快速恢复。结合仓库中 error_code.json 的注册定义与 error_manager.cc 的上报机制,还能进一步理解整个 CANN Runtime 错误码体系的组织与输出方式,为排查同族的 E4 系列错误码(如 E40003 文件打开失败)奠定基础。
【免费下载链接】runtime本项目提供CANN运行时组件和维测功能组件。项目地址: https://gitcode.com/cann/runtime
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考