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
工作。
上一篇: gcc sanitizer: unmap