如何在通过 python 扩展访问的 C++ 库中捕获 AddressSanitizer 引发的错误

How to catch errors raised by AddressSanitizer in C++ libraries accessed via python extension

我有一个 python 模块,它使用外部 C++ 库,使用 C++ 扩展构建和 distutils。当我使用 GCC 的地址清理器、-fsanitize 选项编译 C++ 库时,在 运行 单元测试时出现段错误。现在,最初我认为这是因为我对两个二进制文件、C++ python 扩展和库使用了不同的编译器选项,但现在我越来越相信这是因为地址清理器在库并触发段错误,如 here 所述。 如果我在没有地址清理器的情况下编译 C++ 库,一切正常,这一事实也支持这一点。 当我 运行 单元测试时,程序输出的信息非常少:

./run_unit_tests
Segmentation fault (core dumped)

即使查看核心转储,我也只能找到指向 C++ 库的堆栈跟踪,但没有提到地址清理器。

我尝试使用 ASAN_OPTIONS 将消毒剂输出重定向到文件,但消毒剂显然没有选择选项:

ASAN_OPTIONS=help=1 ./run_unit_tests
Segmentation fault (core dumped)

我应该采取什么策略来确认段错误来自消毒剂并可能发现它是哪种错误?

首先说明几点:

this is because the address sanitizer found an error in the library and triggered a seg fault

当阿三检测到错误时,它总是会发出友好的错误信息。段错误意味着

  • 任何一个仪器在某个时候都出错了
  • 或者(不太可能)检测代码无意中触发了一些已经存在的严重错误

This is also supported by the fact that if I compile the C++ library with undefined behavior sanitizer, everything is working fine

UBSan 比 ASan 简单得多,因此通常您无法真正分享有关它们的结论。

I have tried to use ASAN_OPTIONS to redirect the sanitizer output to a file but the sanitizer apparently does not pick up the options:

help=1 失败的事实告诉我们,在 Asan 能够解析 ASAN_OPTIONS 并做出适当反应之前,经过清理的应用程序在早期启动时出现段错误。当 Asan 的启用方式出现一些基本问题时,通常会发生这种情况。

我的猜测是您错过了 LD_PRELOAD=path/to/libasan.so 环境设置,当将 Asan 应用于单个 DSO 而不是主应用程序时,这是必需的(就像经过清理的 C/C++ 解释器插件一样, 检查 Asan FAQ).

如果这没有帮助,我建议提供更多信息(例如 GCC 版本、segv 处的符号堆栈)。