哪个组件实际上转储核心?

发布于 2024-08-13 07:47:02 字数 94 浏览 6 评论 0原文

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

I am unsure whether this is the C library or some other stuff which dumps contents to core file and make a program Exit. What i mean here is that is the glibc or libc handles the SIGSEGV and creates the core dump in the handler function ? Please explain.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

南…巷孤猫 2024-08-20 07:47:02

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

In linux, the kernel process execution and signal handling mechanisms are responsible.

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);
ぺ禁宫浮华殁 2024-08-20 07:47:02

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

When there's no other handler, the kernel will generate the core file if ulimit -c is greater than 0 for the process.

兮颜 2024-08-20 07:47:02

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

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

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

您可以使用 kill -SEGV 来创建进程转储核心。

The kernel is what creates the core dump, at least in Linux.

As Gonzalo points out, ulimit -c determines the maximum size of the core dump (with 0 disabling it completely and unlimited specifying no limit). Depending on available disk space, you may want to set this to some value other than unlimited to prevent filling a disk, though you'll likely find it hard to use the truncated core file.

The name of the core file can be configured using /proc/sys/kernel/core_uses_pid and /proc/sys/kernel/core_pattern.

You can use kill -SEGV <pid> to make a process dump core.

回忆追雨的时光 2024-08-20 07:47:02

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

I believe that it is handled by the kernel. On Linux, I have not found a library or system call to create one manually, though.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文