首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在通过python扩展访问的AddressSanitizer库中捕获C++引发的错误

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

Stack Overflow用户
提问于 2017-10-06 22:41:56
回答 1查看 1.7K关注 0票数 0

我有一个python模块,它使用一个使用distutils的C++扩展构建的外部C++库。当我用GCC的地址杀菌剂-fsanitize选项编译-fsanitize库时,我在运行单元测试时会得到一个分段错误。现在,我最初认为这是因为我对两个二进制文件( C++ python扩展和库)使用了不同的编译器选项,但现在我越来越确信这是因为地址清除器在库中发现了一个错误,并触发了一个seg错误,正如解释的这里那样。如果我编译没有地址清除器的C++库,一切都会正常运行,这也支持了这一点。当我运行单元测试时,程序输出的信息很少:

代码语言:javascript
运行
复制
./run_unit_tests
Segmentation fault (core dumped)

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

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

代码语言:javascript
运行
复制
ASAN_OPTIONS=help=1 ./run_unit_tests
Segmentation fault (core dumped)

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

EN

Stack Overflow用户

回答已采纳

发布于 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版本,在分段点的符号堆栈)。

票数 2
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46614874

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档