Pull Request已成功合入, 合并人@CANN-robot
(感谢 GuoWenbo 的贡献)变更摘要
该 PR 修复了当 ASCEND_WORK_PATH 路径过长时 trace 模块报错的问题(issue #769)。核心改动是将 trace_recorder.h 和 stacktrace_common.h 中硬编码的路径长度上限(原为 255 字节)统一改为引用 trace_system_api.h 中的 TRACE_MAX_PATH - 1U,从而支持更长的文件路径。同时重构了 TraceRecorderGetDirPath 函数,将目录创建和错误日志逻辑拆分为多个辅助函数,增强失败时的诊断信息(包含 rootPath、dirPath、dirPathLen、limit、stage、reason 等字段),并新增了大量单元测试用例以覆盖长路径场景和各阶段失败场景。
主要改动
-
路径长度常量统一为
TRACE_MAX_PATH:trace_recorder.h中的MAX_FILEDIR_LEN、MAX_FILEPATH_LEN、MAX_FULLPATH_LEN和stacktrace_common.h中的SCD_MAX_FILEDIR_LEN、SCD_MAX_FILEPATH_LEN、SCD_MAX_FULLPATH_LEN均从原先 255 字节硬编码值改为TRACE_MAX_PATH - 1U,扩展了路径容量以容纳较长的ASCEND_WORK_PATH。 -
TraceRecorderGetDirPath重构与错误日志增强:新增TraceRecorderCreateRootDir、TraceRecorderCreateFormattedDir(使用vsnprintf_s)、TraceRecorderFindExistingDir三个辅助函数,以及TraceRecorderLogBuildFailure和TraceRecorderLogMkdirFailure两个日志函数;主函数改用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用例验证路径限制宏值正确性。


代码审查
审查总结
共审查 6 个变更文件,发现 4 个 P3 级建议,无 P0–P2 缺陷。
各文件审查结果
| 文件 | 审查结论 |
|---|---|
src/dfx/trace/atrace/utrace/recorder/trace_recorder.c |
无问题。重构将 TraceRecorderGetDirPath 中的内联路径构建逻辑提取为 TraceRecorderCreateRootDir、TraceRecorderCreateFormattedDir、TraceRecorderFindExistingDir 等辅助函数,错误日志增加了 rootPath、dirPath、dirPathLen、limit 等上下文,信息量显著提升;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:BuildNestedPathForAbsLength 在 basePath 较长时可能返回超过 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 项可后续迭代优化。
⚠️ 已识别出整体风险,但无法提取行内评论,请参考整体评估。


流水线任务触发成功
任务链接 [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执行结束


描述
Diff 摘要
变更类型
关联的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 的说明。
风险和遗留问题