首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >生成核心转储和文本转储linux

生成核心转储和文本转储linux
EN

Stack Overflow用户
提问于 2011-08-24 20:00:20
回答 2查看 987关注 0票数 3

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

代码语言:javascript
运行
复制
signal(SIGINT, SignalHandler);
signal(SIGSEGV, SignalHandler);

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-08-24 20:12:37

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

票数 3
EN

Stack Overflow用户

发布于 2020-06-06 03:40:25

使用raise()函数可以捕获崩溃信息并转储内核信息。

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

照常注册您的信号,但也要用OR设置SA_RESETHAND标志(one shot call):

代码语言:javascript
运行
复制
sa.sa_flags = SA_SIGINFO | SA_RESETHAND;

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

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

因此,当一个信号第一次到达时,解析你的信号信息,并在你的信号处理程序中做任何需要的事情。在处理程序结束之前,调用raise()。

代码语言:javascript
运行
复制
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(),信号处理程序中的崩溃信息和核心转储中的崩溃信息确实匹配。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7175053

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档