什么组件实际转储核心?

时间:2009-12-07 17:54:47

标签: coredump

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

4 个答案:

答案 0 :(得分:5)

在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);

答案 1 :(得分:4)

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

答案 2 :(得分:3)

内核是创建核心转储的原因,至少在Linux中是什么。

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

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

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

答案 3 :(得分:1)

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