我有一个进程在Linux得到一个分割错误。当它失败时,我如何告诉它生成一个核心转储?


当前回答

最后我所做的是在进程崩溃之前将gdb附加到进程,然后当它出现段错误时,我执行generate-core-file命令。强制生成核心转储。

其他回答

还有更多的事情可能会影响核心转储的生成。我遇到了这些问题:

转储目录必须是可写的。默认情况下,这是进程的当前目录,但是可以通过设置/proc/sys/kernel/core_pattern来改变。 在某些情况下,/proc/sys/fs/suid_dumpable中的内核值可能会阻止内核的生成。

还有更多的情况可能会阻止手册页中描述的生成- try man核心。

这取决于您使用的shell。如果使用bash,则ulimit命令控制与程序执行相关的几个设置,例如是否应该转储core。如果你输入

ulimit -c unlimited

然后这将告诉bash,它的程序可以转储任何大小的内核。如果你愿意,你可以指定一个大小,比如52M,而不是无限,但在实践中,这不应该是必要的,因为核心文件的大小可能永远不会成为你的问题。

在tcsh中,您需要输入

limit coredumpsize unlimited

最好使用系统调用setrlimit以编程方式打开核心转储。

例子:

#include <sys/resource.h>

bool enable_core_dump(){    
    struct rlimit corelim;

    corelim.rlim_cur = RLIM_INFINITY;
    corelim.rlim_max = RLIM_INFINITY;

    return (0 == setrlimit(RLIMIT_CORE, &corelim));
}

如上所述,这里提出的真正问题是如何在未启用核心转储的系统上启用它们。这个问题在这里得到了解答。

如果您希望了解如何为挂起进程生成核心转储,那么答案是

gcore <pid>

如果gcore在您的系统上不可用,那么

kill -ABRT <pid>

不要使用kill -SEGV,因为它经常会调用信号处理程序,使诊断卡住进程更加困难

Ubuntu 14.04

检查内核转储是否启用: ulimit - a 其中一行应该是: 核心文件大小(块,-c)不限 如果不是: 中~ /。在文件末尾添加ulimit -c unlimited并保存,重新运行终端。 使用调试信息构建应用程序: 在Makefile中-O0 -g 运行创建核心转储的应用程序(应该在application_name文件附近创建名为“core”的核心转储文件): 。/ application_name 在gdb下运行: GDB application_name core