Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用地址消毒器和gcc7.1.0时如何生成核心转储_Gcc_Coredump_Address Sanitizer - Fatal编程技术网

使用地址消毒器和gcc7.1.0时如何生成核心转储

使用地址消毒器和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

我在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 -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报告,“中止错误不起作用”或类似的内容。这可能是一个很好的起点。