gcc sanitizer:unmap_shadow_on_exit不支持自定义SIGSEGV处理程序

dim*_*mba 7 debugging gcc memory-management

64位系统上的GCC清洁剂创建了大约17TB的巨大核心文件.

如果您需要用于死后分析的核心,您需要将以下选项传递给清洁剂:

  • unmap_shadow_on_exit = 1 - 取消巨大的内存,用于退出时的家务

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

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

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

Sor*_*ren 3

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

所以像;

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

void setMySignalHandler(int sig) {
   oldSigHandler = signal(sig, mySigHandler);
}
Run Code Online (Sandbox Code Playgroud)

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

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