如何在使用Address Sanitizer和gcc7.1.0时生成核心转储文件

5

我在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选项通常会生成核心转储(core dump),例如:

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

当我将gcc更新到7.1.0版本后,即使设置了如上所示的ASAN_OPTIONS,也无法再生成核心转储文件。

2个回答

4
问题已经解决。新的清洁选项 ASAN_OPTIONS 应该设置为 "disable_coredump",我设置如下:

ASAN_OPTIONS="disable_coredump"

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

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

nested bug in the same thread, aborting.

并且退出代码为 1(没有核心转储文件)。从我所看到的源代码片段来看,似乎 asan 处理了它发出的同一 SIGABRT,但将其解释为处理崩溃时的崩溃。不完全符合 -help 中所说的;或许有待改进。

不过,我还是通过另一种选项成功地避免了这种烦人的错误处理:

ASAN_OPTIONS+=:sleep_before_dying=150

当它按照指示进入睡眠状态后,在终端中按下^\Ctrl\,相当于kill -QUIT),最终会生成我一直在寻找的核心文件。

谢谢!在gcc 8.3.1中仍然遇到了“同一线程中嵌套的错误”,我开始有点疯狂了。 :-( - Mike Andrews
1
@MikeAndrews 欢迎! :) 我建议你把这种挫败感转化为一份有建设性的错误报告,比如“abort_on_error不起作用”或类似的内容。https://github.com/google/sanitizers/issues 可能是一个很好的起点。 - ulidtko
1
已在此处报告 https://github.com/google/sanitizers/issues/1072 - user7610

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接