如何捕获C+中AddressSanitizer引发的错误+;通过python扩展访问的库 我有一个Python模块,它使用一个外部的C++库,使用一个带有ditutul的C++扩展构建。当我使用GSAC的地址消除器--FSANITIZE选项编译C++库时,在运行单元测试时会得到一个分段错误。现在,最初我认为这是因为我使用了两个二进制文件的不同编译器选项,即C++ Python扩展和库,但现在我越来越确信这是因为地址消除器在库中发现了错误,并触发了SEG故障,如所解释的。 这也得到了这样的事实:如果我编译C++库而不使用地址消毒器,那么一切都会很好。 当我运行单元测试时,程序输出的信息很少: ./run_unit_tests Segmentation fault (core dumped) P>即使是查看堆内核,我也只能找到指向C++库的堆栈跟踪,但没有提到地址消除器。

如何捕获C+中AddressSanitizer引发的错误+;通过python扩展访问的库 我有一个Python模块,它使用一个外部的C++库,使用一个带有ditutul的C++扩展构建。当我使用GSAC的地址消除器--FSANITIZE选项编译C++库时,在运行单元测试时会得到一个分段错误。现在,最初我认为这是因为我使用了两个二进制文件的不同编译器选项,即C++ Python扩展和库,但现在我越来越确信这是因为地址消除器在库中发现了错误,并触发了SEG故障,如所解释的。 这也得到了这样的事实:如果我编译C++库而不使用地址消毒器,那么一切都会很好。 当我运行单元测试时,程序输出的信息很少: ./run_unit_tests Segmentation fault (core dumped) P>即使是查看堆内核,我也只能找到指向C++库的堆栈跟踪,但没有提到地址消除器。,python,c++,distutils,address-sanitizer,sanitizer,Python,C++,Distutils,Address Sanitizer,Sanitizer,我曾尝试使用ASAN_选项将消毒剂输出重定向到一个文件,但消毒剂显然没有选择这些选项: ASAN_OPTIONS=help=1 ./run_unit_tests Segmentation fault (core dumped) 在这里,我应该采取什么策略来确认seg故障来自消毒器,并可能发现它是什么类型的错误?首先需要澄清: 这是因为地址消毒器在库中发现错误并触发seg故障 当Asan检测到错误时,它将始终发出友好的错误消息。Segfault的意思是 两种仪器都在某个时候出了问题 或者(不太

我曾尝试使用ASAN_选项将消毒剂输出重定向到一个文件,但消毒剂显然没有选择这些选项:

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

在这里,我应该采取什么策略来确认seg故障来自消毒器,并可能发现它是什么类型的错误?

首先需要澄清:

这是因为地址消毒器在库中发现错误并触发seg故障

当Asan检测到错误时,它将始终发出友好的错误消息。Segfault的意思是

  • 两种仪器都在某个时候出了问题
  • 或者(不太可能)插入指令的代码无意中触发了一些已经存在的关键bug

这也支持这样一个事实,如果我用不定义的行为消毒剂编译C++库,一切都工作得很好

UBSan比ASan简单得多,所以一般来说,您无法真正分享关于它们的结论

我曾尝试使用ASAN_选项将消毒剂输出重定向到一个文件,但消毒剂显然没有选择这些选项:

ASAN_OPTIONS=help=1 ./run_unit_tests
Segmentation fault (core dumped)
help=1
失败的事实告诉我们,在Asan能够解析
Asan_选项
并做出适当反应之前,经过消毒的应用程序在早期启动时出现故障。这通常发生在Asan如何启用存在一些基本问题时

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


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

首先需要澄清:

这是因为地址消毒器在库中发现错误并触发seg故障

当Asan检测到错误时,它将始终发出友好的错误消息。Segfault的意思是

  • 两种仪器都在某个时候出了问题
  • 或者(不太可能)插入指令的代码无意中触发了一些已经存在的关键bug

这也支持这样一个事实,如果我用不定义的行为消毒剂编译C++库,一切都工作得很好

UBSan比ASan简单得多,所以一般来说,您无法真正分享关于它们的结论

我曾尝试使用ASAN_选项将消毒剂输出重定向到一个文件,但消毒剂显然没有选择这些选项:

ASAN_OPTIONS=help=1 ./run_unit_tests
Segmentation fault (core dumped)
help=1
失败的事实告诉我们,在Asan能够解析
Asan_选项
并做出适当反应之前,经过消毒的应用程序在早期启动时出现故障。这通常发生在Asan如何启用存在一些基本问题时

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


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

您说您查看了核心转储,但您是否在调试器中实际运行它来跟踪问题?我已经尝试过,但无法获得大量信息,我不确定如何分析核心转储,在启动GDB?@ PrEnnIALista时,我应该指定Python可执行文件还是C++库?一个选项是直接在GDB下面运行您的应用程序:<代码> GDB -EX设置环境AsAsOnOpth=……'-ex'设置环境LDHPyLoad=……-ARGS/UR/BIN/Python…<代码>谢谢@ YYGR,我曾尝试用GDB运行Python单元测试,并且好像在导入C++库时发生分割错误。然而,通过GDB查看跟踪,代码中似乎没有任何错误,SEGFULT是否可以从其他地方触发?在您提供的链接中,在“AddressSanitizeRadso”下,我发现:
\uu asan\u init不是从preinit\u数组调用的,因此有可能在\uu asan\u init(启动时可能导致SEGV;仍然不太可能)
“但是,用GDB查看跟踪,代码中似乎没有任何错误。”-我建议您在问题中添加回溯,并尝试设置
ASAN\u OPTIONS=verbosity=2:debug=1
。您是否尝试导出
LD_PRELOAD
?您说您查看了核心转储,但实际上您是否在调试器中运行它来跟踪问题?我尝试过,但无法获得大量信息,我不确定应该如何分析核心转储,在启动GDB?@ PrEnnIALista时,我应该指定Python可执行文件还是C++库?一个选项是直接在GDB下面运行您的应用程序:<代码> GDB -EX设置环境AsAsOnOpth=……'-ex'设置环境LDHPyLoad=……-ARGS/UR/BIN/Python…<代码>谢谢@ YYGR,我曾尝试用GDB运行python单元测试,似乎在