什么组件实际上转储核心?

Posted

技术标签:

【中文标题】什么组件实际上转储核心?【英文标题】:What component actually dumps core? 【发布时间】:2009-12-07 17:54:47 【问题描述】:

我不确定这是 C 库还是其他将内容转储到核心文件并使程序退出的东西。我的意思是 glibc 或 libc 处理 SIGSEGV 并在处理程序函数中创建核心转储?请解释一下。

【问题讨论】:

【参考方案1】:

在linux中,内核进程执行和信号处理机制负责。

http://lxr.linux.no/#linux+v2.6.32/fs/exec.c#L1752

void do_coredump(long signr, int exit_code, struct pt_regs *regs)
    
    ...

http://lxr.linux.no/#linux+v2.6.32/kernel/signal.c#L1926

            if (sig_kernel_coredump(signr)) 
                    if (print_fatal_signals)
                            print_fatal_signal(regs, info->si_signo);
                    /*
                     * If it was able to dump core, this kills all
                     * other threads in the group and synchronizes with
                     * their demise.  If we lost the race with another
                     * thread getting here, it set group_exit_code
                     * first and our do_group_exit call below will use
                     * that value and ignore the one we pass it.
                     */
                    do_coredump(info->si_signo, info->si_signo, regs);

【讨论】:

【参考方案2】:

当没有其他处理程序时,如果进程的ulimit -c大于0,内核将生成核心文件。

【讨论】:

如果你提到ulimit -c,你应该提到要传递的最有用的值是0unlimited。我没有遇到任何人假装她/他可以对截断的核心转储做任何事情。 嘿。很久以前,当磁盘配额是一个约束时,我才将它设置为那些值以外的值。无论如何,我只是尝试在 gdb 中使用截断的核心文件并收到一条不错的错误消息:“警告:/tmp/core 被截断:预期核心文件大小 >= 147456,找到:12288。”【参考方案3】:

内核是创建核心转储的东西,至少在 Linux 中是这样。

正如 Gonzalo 指出的那样,ulimit -c 确定核心转储的最大大小(0 完全禁用它,unlimited 指定无限制)。根据可用的磁盘空间,您可能希望将其设置为 unlimited 以外的某个值以防止填充磁盘,但您可能会发现很难使用截断的核心文件。

核心文件名可以使用/proc/sys/kernel/core_uses_pid/proc/sys/kernel/core_pattern配置。

您可以使用kill -SEGV <pid> 来制作进程转储核心。

【讨论】:

【参考方案4】:

我相信它是由内核处理的。不过,在 Linux 上,我还没有找到手动创建的库或系统调用。

【讨论】:

如果你在gdb里面,你可以执行'generate-core-file'

以上是关于什么组件实际上转储核心?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 docker 容器中禁用核心文件转储

使用结构和指针的分段错误(核心转储)

Vigenere.c CS50 浮点异常(核心转储)

核心转储文件分析[重复]

Linux 中的核心转储文件是啥?它提供啥信息?

为啥我得到分段(核心转储)?