我不确定这是C库还是其他将内容转储到核心文件并使程序退出的东西。我的意思是glibc或libc处理SIGSEGV并在处理函数中创建核心转储?请解释一下。
答案 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上,我没有找到一个库或系统调用来手动创建一个。