我在centOS7.2.1511上使用-fsanitize = address编译了我的代码,当我将gcc更新为7.1.0时,它不再生成核心转储文件。任何人都可以帮助我吗?谢谢。
gcc complie选项: -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
首先我使用gcc4.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设置如上所述。
答案 0 :(得分:1)
问题解决了。应该设置新的清洁剂选项ASAN_OPTIONS是“disable_coredump”,我这样设置:
ASAN_OPTIONS="disable_coredump=0:unmap_shadow_on_exit=1:abort_on_error=1"
答案 1 :(得分:0)
嗯,从理论上讲,它应该像这样工作:
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,提交1473e85213404eccb4d018d41c24d2f5834f81b5):
nested bug in the same thread, aborting.
并退出代码1(无核心)。从我所看到的源代码中,几乎看不出asan处理的是它发出的SIGABRT,但将其解释为“崩溃时崩溃”。 -help
所说的不太完全;可能需要改进。
不过,我还是可以通过另外一个选项来规避这种发痒的错误处理:
ASAN_OPTIONS+=:sleep_before_dying=150
,然后按照说明进入睡眠状态,在终端上按^\
( Ctrl \ ,相当于{ {1}}。
最后,产生了我一直试图获取的核心文件。