4

-fsanitize=address我在 centOS 7.2.1511 上编译了我的代码。当我将 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 像上面那样设置,也无法再生成核心转储。

4

2 回答 2

4

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

ASAN_OPTIONS="disable_coredump=0:unmap_shadow_on_exit=1:abort_on_error=1"
于 2017-09-01T11:52:52.850 回答
1

好吧,理论上它应该是这样工作的:

  1. ulimit -c unlimited当然(可选调整sysctl kernel.core_pattern
  2. export ASAN_OPTIONS=disable_coredump=0,abort_on_error=1
  3. 运行,获取核心(理想情况下,如果一切正常)。

但是,我尝试了更多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\,相当于kill -QUIT)。

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

于 2018-12-21T13:35:23.923 回答