已合并
fix: ASCEND_WORK_PATH路径过长,trace模块报错 (#769) #3903
fix: ASCEND_WORK_PATH路径过长,trace模块报错 (#769) #3903
已合并
GuoWenbo创建于 7月28日
GuoWenbo成员
7月28日

描述

  • 修复摘要: ASCEND_WORK_PATH路径过长,trace模块报错
  • 变更文件:
  • src/dfx/trace/atrace/utrace/recorder/trace_recorder.c
  • src/dfx/trace/atrace/utrace/recorder/trace_recorder.h
  • src/dfx/trace/atrace/utrace/stacktrace/stacktrace_common.h
  • tests/ut/atrace/ut/utrace/testcase/stacktrace/stacktrace_utest.cc
  • tests/ut/atrace/ut/utrace/testcase/stacktrace_dumper/scd_process_utest.cc
  • tests/ut/atrace/ut/utrace/testcase/trace_recorder_utest.cc

Diff 摘要

.../trace/atrace/utrace/recorder/trace_recorder.c  |  15 ++-
 .../trace/atrace/utrace/recorder/trace_recorder.h  |   9 +-
 .../atrace/utrace/stacktrace/stacktrace_common.h   |   7 +-
 .../utrace/testcase/stacktrace/stacktrace_utest.cc |  21 +++--
 .../stacktrace_dumper/scd_process_utest.cc         |  47 +++++++++-
 .../ut/utrace/testcase/trace_recorder_utest.cc     | 101 +++++++++++++++++++--
 6 files changed, 173 insertions(+), 27 deletions(-)

变更类型

关联的Issue

https://gitcode.com/cann/runtime/issues/769

如何测试

  • 测试结论: PASS

  • 检测到代码变更文件 6 个: src/dfx/trace/atrace/utrace/recorder/trace_recorder.c, src/dfx/trace/atrace/utrace/recorder/trace_recorder.h, src/dfx/trace/atrace/utrace/stacktrace/stacktrace_common.h, tests/ut/atrace/ut/utrace/testcase/stacktrace/stacktrace_utest.cc, tests/ut/atrace/ut/utrace/testcase/stacktrace_dumper/scd_process_utest.cc, tests/ut/atrace/ut/utrace/testcase/trace_recorder_utest.cc

  • 测试日志包含通过信号

  • 测试日志覆盖计划测试项 3 条

核对清单

其他信息

在此添加任何其他关于本次 PR 的说明。

风险和遗留问题

  • (none)
likedislike
Pull Request已成功合入, 合并人@CANN-robot
(感谢 GuoWenbo 的贡献)
GGuoWenbo成员
7月28日 创建了 pull request,commit 64719b77
GGuoWenbo成员
7月28日 关联了issue:[Bug-Report|缺陷反馈]: ASCEND_WORK_PATH路径过长,trace模块报错
atomgit-bot
atomgit-bot
7月28日 评论:

变更摘要

该 PR 修复了当 ASCEND_WORK_PATH 路径过长时 trace 模块报错的问题(issue #769)。核心改动是将 trace_recorder.hstacktrace_common.h 中硬编码的路径长度上限(原为 255 字节)统一改为引用 trace_system_api.h 中的 TRACE_MAX_PATH - 1U,从而支持更长的文件路径。同时重构了 TraceRecorderGetDirPath 函数,将目录创建和错误日志逻辑拆分为多个辅助函数,增强失败时的诊断信息(包含 rootPath、dirPath、dirPathLen、limit、stage、reason 等字段),并新增了大量单元测试用例以覆盖长路径场景和各阶段失败场景。

主要改动

  • 路径长度常量统一为 TRACE_MAX_PATHtrace_recorder.h 中的 MAX_FILEDIR_LENMAX_FILEPATH_LENMAX_FULLPATH_LENstacktrace_common.h 中的 SCD_MAX_FILEDIR_LENSCD_MAX_FILEPATH_LENSCD_MAX_FULLPATH_LEN 均从原先 255 字节硬编码值改为 TRACE_MAX_PATH - 1U,扩展了路径容量以容纳较长的 ASCEND_WORK_PATH

  • TraceRecorderGetDirPath 重构与错误日志增强:新增 TraceRecorderCreateRootDirTraceRecorderCreateFormattedDir(使用 vsnprintf_s)、TraceRecorderFindExistingDir 三个辅助函数,以及 TraceRecorderLogBuildFailureTraceRecorderLogMkdirFailure 两个日志函数;主函数改用 goto failed 统一错误出口,每条日志携带明确的 stage(root_dir/atrace_dir/first_trace_dir/second_event_dir)、reason(snprintf_s/mkdir)、路径长度等诊断上下文,便于定位长路径导致的失败位置。

  • trace_recorder.h 引入 trace_system_api.h:新增 #include "trace_system_api.h",使得 MAX_FILEPATH_LEN 等宏能直接引用 TRACE_MAX_PATH

  • stacktrace_common.h 同步更新路径限制并引入依赖:新增 #include "trace_system_api.h",并将 SCD_MAX_FILEDIR_LEN/SCD_MAX_FILEPATH_LEN/SCD_MAX_FULLPATH_LEN 三个宏统一为 TRACE_MAX_PATH - 1U

  • 新增大量单元测试覆盖长路径和失败日志场景:在 trace_recorder_utest.cc 中新增 BuildNestedRelativePathForAbsLength 辅助函数及 9 个测试用例(覆盖 240 字节长路径写入、根目录/各级子目录的 snprintf_s 和 mkdir 失败日志验证等);在 scd_process_utest.cc 中新增 BuildNestedPathForAbsLength 辅助函数及 TestScdProcessDump_LongFilePathCreatesTxt 测试用例;在 stacktrace_utest.cc 中新增 TestStacktracePathLimitsUseTraceMaxPath 用例验证路径限制宏值正确性。

likedislike
不准确?
atomgit-bot
atomgit-bot
7月28日 评论:

代码审查

审查总结

共审查 6 个变更文件,发现 4 个 P3 级建议,无 P0–P2 缺陷。

各文件审查结果

文件 审查结论
src/dfx/trace/atrace/utrace/recorder/trace_recorder.c 无问题。重构将 TraceRecorderGetDirPath 中的内联路径构建逻辑提取为 TraceRecorderCreateRootDirTraceRecorderCreateFormattedDirTraceRecorderFindExistingDir 等辅助函数,错误日志增加了 rootPathdirPathdirPathLenlimit 等上下文,信息量显著提升;goto failed 清理路径正确。
src/dfx/trace/atrace/utrace/recorder/trace_recorder.h P3:MAX_FILEDIR_LEN/MAX_FILEPATH_LEN/MAX_FULLPATH_LEN 三个宏现在值相同(均为 TRACE_MAX_PATH - 1U),叠层命名失去区分度,导致部分仅需短缓冲的局部变量(如 TraceRecorderSafeGetFd 中的 tmp[4095])栈占过大。
src/dfx/trace/atrace/utrace/stacktrace/stacktrace_common.h 无问题。SCD_MAX_* 宏改为基于 TRACE_MAX_PATH,与 recorder 层保持一致;增补 #include "trace_system_api.h" 提供 TRACE_MAX_PATH 定义。
tests/ut/atrace/ut/utrace/testcase/stacktrace/stacktrace_utest.cc 无问题。新增 TestStacktracePathLimitsUseTraceMaxPath 编译期断言,验证 SCD_MAX_* 宏值与 TRACE_MAX_PATH - 1U 一致。
tests/ut/atrace/ut/utrace/testcase/stacktrace_dumper/scd_process_utest.cc P3:BuildNestedPathForAbsLengthbasePath 较长时可能返回超过 targetAbsLen 的路径,降低测试精确性。
tests/ut/atrace/ut/utrace/testcase/trace_recorder_utest.cc P3×2:(a) BuildNestedRelativePathForAbsLength 在 cwd 较长时同理;(b) TestRecordEnvRelativePathMaxLengthInitSucceeds 构造 150+ 级嵌套目录,测试过慢且对环境敏感。

整体风险评估

低风险。本次变更的核心改动——将路径长度上限从硬编码 255 字节提升为系统 PATH_MAX(典型 4096)——准确解决了 ASCEND_WORK_PATH 路径较长时 trace 模块报错的问题。代码重构清晰,错误日志质量显著提高。三个宏语义收敛为同一值虽造成命名分层冗余和部分缓冲区浪费,但不影响功能正确性。测试辅助函数的边界行为偏差仅在极端 CI 环境下可能触发,且仅影响测试断言精度。建议合入,P3 项可后续迭代优化。

⚠️ 已识别出整体风险,但无法提取行内评论,请参考整体评估。

likedislike
不准确?
CANN-robotCANN-robot成员
7月28日 添加了label:cann-cla/yes
此处折叠了125条消息 查看更多
CANN-robot
CANN-robot成员
8月6日 评论:

流水线任务触发成功
任务链接 [b8421c9aae4346c69f609588c5b69d56][流水线指导]

任务名称状态日志下载链接
codecheck ✅ SUCCESS >>>>>
SCA ✅ SUCCESS >>>>>
antipoison ✅ SUCCESS >>>>>
codecheck_Check_Pr ✅ SUCCESS
codecheck_style ✅ SUCCESS >>>>>
codecheck_precommit ✅ SUCCESS >>>>>
StaticCheck_codespell ✅ SUCCESS
StaticCheck_link_validity ✅ SUCCESS
StaticCheck_resource_existence ✅ SUCCESS
StaticCheck_tag_closed ✅ SUCCESS
StaticCheck_markdownlint ✅ SUCCESS

[2026-08-06 20:36:21]    CI执行结束

likedislike
CANN-robotCANN-robot成员
8月6日 添加了label:api-check-pass
CANN-robotCANN-robot成员
8月6日 删除了label:ci-pipeline-running
CANN-robotCANN-robot成员
8月6日 添加了label:ci-pipeline-passed
CANN-robotCANN-robot成员
8月6日 合入了pull request