生成核心转储以及Linux的文本转储

问题描述 投票:3回答:2

如果仅将coredump限制设置为unlimted。核心转储文件由linux生成。但是如果我只做信号处理以及将核心转储限制设置为unlimit。 Linux不会生成核心转储。

signal(SIGINT, SignalHandler);
signal(SIGSEGV, SignalHandler);

如何在Linux中生成文本转储和核心转储?

c++ linux
2个回答
3
投票

将信号处理程序设置为一种触发模式(例如,将SA_RESETHAND标志用于sigaction(2),然后在自定义SIGINT / SIGSEGV信号处理程序的末尾调用abort()。


0
投票

使用raise()函数可帮助我捕获崩溃信息并转储核心信息。

https://www.man7.org/linux/man-pages/man3/raise.3.html

一如既往地注册您的信号,并使用OR设置SA_RESETHAND标志(一次调用):

sa.sa_flags = SA_SIGINFO | SA_RESETHAND;

https://www.man7.org/linux/man-pages/man2/sigaction.2.html

如果设置了该标志,则在调用信号处理程序后,下次接收到相同的信号时,您的处理函数将被默认的处理函数替换。

因此,信号第一次到达时,解析您的信号信息并在信号处理程序中执行所需的任何操作。在您的处理程序结束之前,请调用raise()。

void signalHandler(int receivedSignal, siginfo_t* info, void* args)
{
    /* Parse args and info as you wish */
    ...
    /* Re-trigger the same signal, but now the kernel or systemd will handle it 
       and dump the core status */
    raise(receivedSignal);
}

raise()将触发您刚刚处理过的相同信号,但是由于信号处理程序功能只是一次触发,因此您的过程现在将忽略重复的信号。内核或systemd这次将捕获信号并生成核心转储。

就我而言,如果使用了raise(),则信号处理程序中的崩溃信息与核心转储中的崩溃信息会匹配。

© www.soinside.com 2019 - 2024. All rights reserved.