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

Generate core dump as well as text dump linux

本文关键字:转储 文本 linux 核心      更新时间:2023-10-16

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

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

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

将信号处理程序设置为一次射击模式(例如使用SA_RESETHAND标志为sigaction(2)),并在自定义SIGINT/SIGSEGV信号处理程序结束时调用abort()。

使用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(),信号处理程序中的崩溃信息和核心转储中的崩溃信息确实匹配。