gcc sanitizer:unmap

64位系统上的GCC消毒剂创建了大约17TB的巨大核心文件。

如果你想要一个核心进行死后分析,你需要将以下选项传递给消毒剂:

  • unmap_shadow_on_exit = 1 - 取消了大量内存,用于在退出时进行维护

  • disable_core = 0 - 在64位系统上创建核心文件

    但是,如果您使用自己的信号处理程序处理SIGSEGV,则unmap_shadow_on_exit不起作用,并且会创建一个巨大的核心文件。

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


    常规信号处理程序不会丢失,但会在设置客户处理程序时返回 - 因此,在您完成自己的处理程序中的任何功能后,只需将该代码作为自己的信号处理程序的一部分调用即可。

    所以像是;

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

    我一般认为信号处理程序是邪恶的,并尽量避免它们 - 但这可能对您有用。

    或者,如果你只想避免核心转储文件,你可以尝试使用shell中的ulimit -c或者在你自己的代码中编程的方式来限制核心转储的大小 - 但是核心文件以这种方式被截断并不总是与你需要的gdb工作。

    链接地址: http://www.djcxy.com/p/33955.html

    上一篇: gcc sanitizer: unmap

    下一篇: How to monitor tensor values in Theano/Keras?