使用Address Sanitizer和gcc7.1.0

时间:2017-09-01 09:31:20

标签: gcc coredump address-sanitizer

我在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设置如上所述。

2 个答案:

答案 0 :(得分:1)

问题解决了。应该设置新的清洁剂选项ASAN_OPTIONS是“disable_coredump”,我这样设置:

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

答案 1 :(得分:0)

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

  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,提交1473e85213404eccb4d018d41c24d2f5834f81b5):

  

nested bug in the same thread, aborting.

并退出代码1(无核心)。从我所看到的源代码中,几乎看不出asan处理的是它发出的SIGABRT,但将其解释为“崩溃时崩溃”。 -help所说的不太完全;可能需要改进。


不过,我还是可以通过另外一个选项来规避这种发痒的错误处理:

ASAN_OPTIONS+=:sleep_before_dying=150

,然后按照说明进入睡眠状态,在终端上按^\ Ctrl \ ,相当于{ {1}}。

最后,产生了我一直试图获取的核心文件。