已关闭
[Bug-Report|缺陷反馈]: x86 默认开启 ASAN 导致 UT 编译阶段 gen_esb 崩溃,--asan=false 因脚本缓存陈旧不生效 #466
gothizzz创建于 6月25日关闭于 7月3日
6月25日 添加了label:buginfra-tooling
6月25日 关联了pull request:fix(cmake): ENABLE_ASAN 变化时重新生成 es lock 脚本,修复 --asan=false 缓存陈旧
6月25日 关联了pull request:docs: 标注 lcov 可选、UT 补充 ASAN 默认开启提示、Dockerfile 升级至 ubuntu22.04
GengChao
6月25日 评论:
6月25日 评论:
感谢你的提问和修复,很好的问题,尝试解答一下:
- 排查 gen_esb 处理 stub_geir_ops 时的内存缺陷(根因)-- 这个比较怀疑是asan本身的偶发问题,理由是
generate_es_ge_test_code(输入 opp_standard_path_test_ops_proto)在相同 ASAN 配置下成功生成了 142 个算子; generate_es_ut_test_code(输入 opp_standard_path_stub_geir_ops)失败。对于gen_esb来说,就是一个简单的代码生成工具,从原型so读原型生成对应为代码,只有喂的原型so差异不会导致一个SEGV一个正常,所以可以多尝试几次看看(尝试的方式可以参考第三点本地手动改一下run_gen_esb_with_lock.sh的脚本,让其判断返回值为1自动重试) - run_gen_esb_with_lock.sh 在 ENABLE_ASAN 变化时重新生成(消除缓存陈旧),使 --asan=false 可靠生效 --可以优化,看到你已经提了优化pr,感谢~
- 重试逻辑考虑覆盖 ASAN "nested bug" 退出码-- 这个可以针对1的返回值添加重试,避免本地asan库本身的偶先问题,这个后续我来提交一个pr修复


6月27日 关联了pull request:fix: gen_esb 脚本使用单文件 sync 替换全局 sync 避免长时间阻塞
此处折叠了10条事件消息 查看更多
在您提交issue前,请确认以下信息:
[x] 我已经搜索过现有和历史issues,确认这是一个新问题
问题描述
在 openEuler 24.03 LTS(x86_64)环境下,按
docs/zh/build.md执行 UT:UT 在编译阶段即失败,无法生成任何测试可执行文件,0 用例执行。失败发生在测试框架的代码生成步骤
generate_es_ut_test_code,根因为gen_esb在 ASAN 下发生段错误(AddressSanitizer: nested bug)。run_test.sh在 x86 架构下默认自动开启 ASAN(ENABLE_ASAN=true,见tests/run_test.sh第 567-571 行),因此该问题是 x86 环境 UT 的默认行为,外部开发者按文档直接执行即可复现。复现步骤
docs/zh/build.md与scripts/init_env.sh安装 CANN Toolkit 9.1.0 及全部依赖(gcc 12.3.1 / cmake 3.27.9 / python 3.11 等,scripts/check_env.sh26 项 PASS)。source /usr/local/Ascend/cann/set_env.shbash tests/run_test.sh --ut=ge_common -j12期望
UT 编译完成并执行测试用例,或在 ASAN 下检测到问题时给出清晰的可重试/可定位信息。
实际
注意:
generate_es_ge_test_code(输入opp_standard_path_test_ops_proto)在相同 ASAN 配置下成功生成了 142 个算子;generate_es_ut_test_code(输入opp_standard_path_stub_geir_ops)失败。gen_esb二进制、同一 LD_PRELOAD,仅 OPP 输入不同 →gen_esb处理stub_geir_ops数据时存在被 ASAN 捕获的内存缺陷。根因分析
cmake/generate_es_package.cmake生成的build_ut/cmake/run_gen_esb_with_lock.sh中,当ENABLE_ASAN=true时会对gen_esb执行LD_PRELOAD=$(gcc -print-file-name=libasan.so)(第 286-289 行),用于给gen_esb链接的、带-fsanitize=address编译的依赖库(如libgraph.so)提供 ASAN 运行时。gen_esb自身(compiler/graph/eager_style_graph_builder/es_generator/CMakeLists.txt)使用${AIR_COMMON_COMPILE_OPTION}编译,未带-fsanitize=address(build_ut/.../gen_esb.dir/flags.make无 fsanitize)。objdump -p显示gen_esb及其依赖libgraph.so的NEEDED列表中均无 libasan,libasan 仅通过LD_PRELOAD注入。stub_geir_ops输入时触发SEGV,ASAN 报 "nested bug in the same thread, aborting",退出码为 1。run_gen_esb_with_lock.sh的重试逻辑(第 299-313 行)只对退出码 139(SIGSEGV)/126/127 重试,退出码 1 被判定为[Non-retriable]直接放弃 → 编译失败。附带问题:
--asan=false不生效(脚本缓存陈旧)run_gen_esb_with_lock.sh由if (NOT EXISTS ${ES_LOCK_SCRIPT})保护(generate_es_package.cmake第 185 行),仅在首次 cmake 配置时生成一次,ASAN 开关被烘焙进脚本内容。因此:build_ut后,再执行bash tests/run_test.sh --ut=ge_common --asan=false时,脚本不会被重新生成,LD_PRELOAD libasan依然生效,--asan=false形同虚设;rm -rf build_ut(或删除build_ut/cmake/run_gen_esb_with_lock.sh)才能让--asan=false真正生效。环境信息
scripts/check_env.sh:26 PASS / 1 ERROR(lcov,可选) / 2 WARNING影响
bash tests/run_test.sh --ut=*默认即失败,外部开发者无法按文档完成 UT 验证;--asan=false因脚本缓存陈旧无法作为有效规避手段;期望的修复方向(建议)
gen_esb处理stub_geir_ops时的内存缺陷(根因);run_gen_esb_with_lock.sh在ENABLE_ASAN变化时重新生成(消除缓存陈旧),使--asan=false可靠生效;