You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何区分Address Sanitizer错误与程序自身错误?exitcode设置无效排查

解决Address Sanitizer退出码无法自定义的问题

问题根源

默认情况下,ASAN检测到内存错误后会调用abort()触发SIGABRT信号终止程序,此时shell返回的退出码是128 + 信号编号(比如SIGABRT对应6,退出码为134),而非你通过ASAN_OPTIONS设置的exitcode值。你看到退出码始终为1,大概率是环境中存在信号退出码的特殊处理,但核心问题是exitcode选项仅在ASAN使用exit()而非信号终止程序时才生效。

解决方法

必须同时设置两个ASAN选项:

  • abort_on_error=0:禁用ASAN通过abort()终止程序的行为,改用exit()返回指定码
  • exitcode=N:自定义ASAN检测到错误时的退出码(N可取0-255之间任意值)

验证示例

用你的编译后的程序测试:

ASAN_OPTIONS="abort_on_error=0:exitcode=0" /tmp/tmp.bin ; echo $?

此时输出应为0,即你设置的自定义退出码。

区分两种失败场景

  • ASAN检测到错误:按配置返回自定义exitcode值
  • 程序自身运行失败(如main返回非0、被其他信号终止):退出码由程序本身或对应信号规则决定,不受ASAN的exitcode配置影响,以此实现两种失败场景的区分

内容的提问来源于stack exchange,提问作者Sourav Kannantha B

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 14:22:09