使用地址消毒器和gcc7.1.0时如何生成核心转储
我在centOS 7.2.1511上用使用地址消毒器和gcc7.1.0时如何生成核心转储,gcc,coredump,address-sanitizer,Gcc,Coredump,Address Sanitizer,我在centOS 7.2.1511上用-fsanize=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 -lmysqlcli
-fsanize=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_选项生成的:
export ASAN_OPTIONS="disable_core=0:unmap_shadow_on_exit=1:abort_on_error=1"
ASAN_OPTIONS="disable_coredump=0:unmap_shadow_on_exit=1:abort_on_error=1"
当我将gcc更新为7.1.0时,即使ASAN_选项如上所述设置,核心转储也无法再生成。问题已解决。新的消毒器选项ASAN_选项应设置为“禁用coredump”,我将其设置为:
export ASAN_OPTIONS="disable_core=0:unmap_shadow_on_exit=1:abort_on_error=1"
ASAN_OPTIONS="disable_coredump=0:unmap_shadow_on_exit=1:abort_on_error=1"
理论上应该是这样的:
export ASAN_OPTIONS="disable_core=0:unmap_shadow_on_exit=1:abort_on_error=1"
ASAN_OPTIONS="disable_coredump=0:unmap_shadow_on_exit=1:abort_on_error=1"
ulimit-c unlimited
当然(可以选择调整sysctl内核.core\u模式
)export ASAN\u OPTIONS=disable\u coredump=0,abort\u on\u error=1
disable\u coredump=0
,halt\u on\u error=1
,abort\u on\u error=1
,handle\u abort=0
——每次我得到的只是一个恼人的ASAN错误(@LLVM 8,commit 1473e85213400eccb4d018d41c24d2f5834f81b5):
在同一线程中嵌套错误,正在中止。
退出代码1(无核心)。从我所拍摄的一点光源来看,似乎asan处理的是它发出的相同信号,但将其解释为一次边处理边碰撞(crash-while-handling-a-crash)。不完全是-help
所说的;也许这是一件需要改进的事情
尽管如此,我还是可以通过另一个选项绕过这个棘手的错误处理:
ASAN_OPTIONS+=:sleep_before_dying=150
然后,当它按照指示睡觉时,点击终端中的^\
(Ctrl\,相当于kill-QUIT
)
最终,我得到了我一直想要的核心文件。谢谢!在gcc 8.3.1中仍然遇到了“同一线程中的嵌套bug”。我开始有点疯狂了-(@MikeAndrews welcome!:)让我建议将这种沮丧情绪转化为一份建设性的bug报告,“中止错误不起作用”或类似的内容。这可能是一个很好的起点。