如果我只将coredump限制设置为无限制。核心转储文件由linux生成。 但是,如果我这样做,但信号处理以及将核心转储限制设置为无限制。 Linux不会生成核心转储。
signal(SIGINT, SignalHandler);
signal(SIGSEGV, SignalHandler);
如何在linux中生成文本转储和核心转储?
答案 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(),则信号处理程序中的崩溃信息和核心转储中的崩溃信息会匹配。