debugging - gcc sanitizer : unmap_shadow_on_exit not honored with custom SIGSEGV handler

标签 debugging gcc memory-management

GCC sanitizer在 64 位系统上创建 huge core files约 17TB。
如果您想要一个用于死后分析的核心,您需要将以下选项传递给 sanitizer:

  • unmap_shadow_on_exit = 1 - 取消映射巨大的内存,用于退出时的内务管理
  • disable_core = 0 - 在 64 位系统上创建核心文件
    但是,如果您使用自己的信号处理程序处理 SIGSEGV,则 unmap_shadow_on_exit 不起作用并且会创建一个巨大的核心文件。

  • 任何想法如何强制 unmap_shadow_on_exit 完成它的工作?

    最佳答案

    常规信号处理程序不是 lost but returned当您设置您的客户处理程序时 - 因此,在您完成您自己的处理程序中的任何功能之后,简单地调用该代码作为您自己的信号处理程序的一部分可能会起作用。

    所以像;

    sighandler_t oldSigHandler = 0;
    void mySigHandler(int sig) {
       ... your code ...
       if (oldSigHandler) oldSigHandler(sig);
    }
    
    void setMySignalHandler(int sig) {
       oldSigHandler = signal(sig, mySigHandler);
    }
    

    我通常认为信号处理程序是邪恶的,并尽量避免它们——但这可能对你有用。

    或者,如果您只想避免核心转储文件,您可以尝试使用 ulimit -c 限制核心转储的允许大小。从 shell 或 programmatic从您自己的代码中 - 但是,以这种方式截断的核心文件并不总是适用于 gdb这是你的需要。

    关于debugging - gcc sanitizer : unmap_shadow_on_exit not honored with custom SIGSEGV handler,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37043314/

    相关文章:

    c - 如何8字节对齐静态数组中的每个字符串?

    c - C 中 malloc 的惯用宏?

    c# - 这些对象的引用是在栈上还是在堆上?

    Javascript on html Canvas 元素问题

    flutter - 是什么导致问题线程 1 : EXC_RESOURCE RESOURCE_TYPE_MEMORY (limit=650 MB, 未使用=0x0)?

    debugging - 简单的 MediaWiki 扩展调试

    c++ - 一个 c++ 程序在两个 IDE 中返回不同的结果

    Android 调试器错误 (MonoDroid)

    c++ - 库的链接顺序问题

    c++ - 被调用者分配被调用者释放