我有一个python模块,它使用带有distutils的C ++扩展构建的外部C ++库。当我使用地址清理程序,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)
我应该采取什么策略来确认来自消毒剂的seg故障并且可能发现它是什么样的错误?
答案 0 :(得分:2)
首先澄清几点:
这是因为地址清理程序在库中发现错误并触发了seg错误
当Asan检测到错误时,它将始终发出友好的错误消息。 Segfault意味着
如果我使用未定义的行为清理程序编译C ++库,一切都运行良好,这也得到了支持
UBSan 比ASan更简单,所以一般来说你无法真正分享他们的结论。
我曾尝试使用ASAN_OPTIONS将清洁剂输出重定向到文件,但清洁剂显然没有选择选项:
help=1
失败的事实告诉我们,在Asan能够解析ASAN_OPTIONS
并做出适当反应之前,已清理的应用程序会在早期启动时发生错误。当Asan启用时存在一些基本问题时,通常会发生这种情况。
我的猜测是你错过了LD_PRELOAD=path/to/libasan.so
环境设置,这在将Asan应用于单个DSO而不是主应用程序时是必需的(对于解释器的清理C / C ++插件,请检查Asan FAQ })。
如果这没有帮助,我建议提供更多信息(例如GCC版本,segv点的符号堆栈)。