使用地址消毒剂和GCC7.1.0时,如何生成核心转储



我在CENTOS 7.2.1511上用-fsanitize=address编译了我的代码。当我将GCC更新为7.1.0时,它无法生成核心转储文件。有人可以帮我吗?

GCC编译选项:

-lm -g3 -Wall -Wno-unknown-pragmas --std=c++11 -Werror -ggdb -fsanitize=address -fno-omit-frame-pointer -D_GLIBCXX_USE_CXX11_ABI=0

链接选项:

-lxml2 -lpthread -lmysqlclient -L/usr/lib64/mysql/ -llog4cxx -lprotobuf -llua -lluabind -lhiredis -lcrypto -lcurl -ljsoncpp -Wl,-E -fsanitize=address -ldl

当我使用GCC 4.8.5时,通常会生成核心转储,并以这样的选项设置为ASAN_OPTIONS:

export ASAN_OPTIONS="disable_core=0:unmap_shadow_on_exit=1:abort_on_error=1"

当我将GCC更新为7.1.0时,即使ASAN_OPTIONS类似于上述设置,Core Dump也无法生成。

解决问题。设置新的消毒器选项Asan_options是" Disable_coredump",我将其设置为这样:

ASAN_OPTIONS="disable_coredump=0:unmap_shadow_on_exit=1:abort_on_error=1"

好吧,从理论上讲,它应该像这样工作:

  1. ulimit -c unlimited当然(可选调整sysctl kernel.core_pattern
  2. export ASAN_OPTIONS=disable_coredump=0,abort_on_error=1
  3. 运行,获得核心(理想情况下,如果所有工作都可以)。

但是,我已经尝试了更多的disable_coredump=0halt_on_error=1abort_on_error=1handle_abort=0的组合 - 每次我每次都遇到的只是一个烦人的Asan错误(@ llvm 8,提交1473E85213404ECCB4D018D41C241C24D2F5834F81B5)

nested bug in the same thread, aborting.

和退出代码1(无核心)。从几乎没有瞥见我所采用的来源的东西来看,Asan似乎处理了它发出的相同的sigabrt,但将其解释为崩溃时的崩溃。不完全是-help所说的;也许要改进的东西。


仍然,我能够使用另一种选择来规避此痒的错误处理:

ASAN_OPTIONS+=:sleep_before_dying=150

然后,当它按照指示入睡时,在端子中击中^ ctrl ,相当于kill -QUIT)。

最终产生了我一直在尝试获取的核心文件。

相关内容

  • 没有找到相关文章

最新更新