我有一个python模块,它使用一个使用distutils的C++扩展构建的外部C++库。当我用GCC的地址杀菌剂-fsanitize选项编译-fsanitize库时,我在运行单元测试时会得到一个分段错误。现在,我最初认为这是因为我对两个二进制文件( C++ python扩展和库)使用了不同的编译器选项,但现在我越来越确信这是因为地址清除器在库中发现了一个错误,并触发了一个seg错误,正如解释的这里那样。如果我编译没有地址清除器的C++库,一切都会正常运行,这也支持了这一点。当我运行单元测试时,程序输出的信息很少:
./run_unit_tests
Segmentation fault (core dumped)
即使查看核心转储,我也只能找到指向C++库的堆栈跟踪,而没有提到地址清除器。
我尝试使用ASAN_OPTIONS将消毒液输出重定向到文件,但消毒液显然没有选择这些选项:
ASAN_OPTIONS=help=1 ./run_unit_tests
Segmentation fault (core dumped)
在这里我应该采取什么策略来确认seg故障来自消毒液,并可能发现它是什么样的错误?
发布于 2017-10-08 06:31:06
首先,作出几点澄清:
这是因为地址消毒程序在库中发现了一个错误,并触发了一个seg错误。
当Asan检测到错误时,它总是会发出友好的错误消息。分段故障意味着
如果我用未定义的行为清除器编译C++库,则一切正常。
UBSan比ASan简单得多,所以一般来说,您不能真正分享关于它们的结论。
我尝试使用ASAN_OPTIONS将消毒液输出重定向到文件,但消毒液显然没有选择这些选项:
help=1
失败的事实告诉我们,在Asan能够解析ASAN_OPTIONS
并做出适当反应之前,经过消毒的应用程序在早期启动时就出现了故障。这种情况通常发生在Asan的启用方式存在一些基本问题时。
我的猜测是,当将Asan应用到单个DSO而不是主应用程序时,您会忽略LD_PRELOAD=path/to/libasan.so
环境设置(就像用于解释器的消毒C/C++插件一样,请检查Asan常见问题)。
如果这没有帮助,我建议提供更多的信息(例如GCC版本,在分段点的符号堆栈)。
https://stackoverflow.com/questions/46614874
复制相似问题