Address Sanitizer - 我可以在 N 个缺陷后停止吗?

Posted

技术标签:

【中文标题】Address Sanitizer - 我可以在 N 个缺陷后停止吗?【英文标题】:Address Sanitizer - can I stop after N defects? 【发布时间】:2019-02-21 16:44:01 【问题描述】:

我意识到某些 Address Sanitizer 功能可能因 GCC 和 clang 而异;我的兴趣主要是 GCC(目前使用 GCC 6.2 和 7.3)

我可以使用ASAN_OPTIONS 设置halt_on_error=0 在报告缺陷后继续运行,或者将其设置为 1 以在报告第一个缺陷后立即停止。

我正在寻找的是一种在 N 个缺陷后停止的方法。 halt_on_error=N 不起作用,因为它只是一个二进制设置(开/关)。

有没有其他方法可以做到这一点:

当简单地在命令行运行 exe 时,通过一些环境设置? 在调试器内部时 - 例如类似b some_asan_defect_reporting_function if (asan_defect_count == N)

提前感谢您提供上述任何信息。

戈登

【问题讨论】:

顺便说一句,我意识到我可以通过添加 __asan_on_error() 的实现来实现这一点,该实现计算它被调用的次数等;不过在这样做之前,我只是想检查一下该功能是否已经在消毒剂的某个地方实现了。 halt_on_error=N - 我的印象是 N 这里的意思是 unique 错误的数量。 不幸的是:setenv ASAN_OPTIONS "halt_on_error=2" ; a.out 错误:bool 选项的值无效:'2' 错误:标志解析失败。 【参考方案1】:

曾经有一个补充 ASAN_OPTIONS=max_errors=N 标志 halt_on_error 但它在代码审查期间提出了太多问题并且没有令人信服的用例所以我中途放弃了它(你可以看到它被丢弃在this stage)。如果您觉得它可能有用,请尝试在 Sanitizers tracker 中提交错误。

【讨论】:

以上是关于Address Sanitizer - 我可以在 N 个缺陷后停止吗?的主要内容,如果未能解决你的问题,请参考以下文章

Address Sanitizer - 抑制 gtest

Advanced Debugging and the Address Sanitizer

在Android上使用Address Sanitizer构建但使用CMake

使用 Address Sanitizer 编译程序时出错

Xcode特性Address Sanitizer

使用 Address Sanitizer 和 gcc7.1.0 时如何生成核心转储