我在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"
好吧,从理论上讲,它应该像这样工作:
-
ulimit -c unlimited
当然(可选调整sysctl kernel.core_pattern
) -
export ASAN_OPTIONS=disable_coredump=0,abort_on_error=1
- 运行,获得核心(理想情况下,如果所有工作都可以)。
但是,我已经尝试了更多的disable_coredump=0
,halt_on_error=1
,abort_on_error=1
,handle_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
)。
最终产生了我一直在尝试获取的核心文件。