生成核心转储以及文本转储linux

时间:2011-08-24 12:00:20

标签: c++ linux

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

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

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

2 个答案:

答案 0 :(得分:3)

将信号处理程序设置为单次模式(例如,使用SA_RESETHAND标志为sigaction(2))并在自定义SIGINT / SIGSEGV信号处理程序的末尾调用abort()。

答案 1 :(得分: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(),则信号处理程序中的崩溃信息和核心转储中的崩溃信息会匹配。

相关问题