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


当前回答

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

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

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

其他回答

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

Ubuntu 19.04

其他的答案都帮不了我。但下面的总结起到了作用

创建~ /。配置/apport/settings包含以下内容:

[main]
unpackaged=true

(这告诉apport也为自定义应用程序编写核心转储)

检查:ulimit -c。如果输出0,用

ulimit -c unlimited

只是为了以防万一重启apport:

sudo systemctl restart apport

崩溃文件现在被写入/var/ Crash /。但是不能在gdb中使用它们。要在gdb中使用它们,请使用

apport-unpack <location_of_report> <target_directory>

进一步的信息:

一些回答建议更改core_pattern。请注意,重新启动时该文件可能会被apport服务覆盖。 仅仅停止出口并不能起到作用 ulimit -c值可能会在您尝试web的其他答案时自动更改。确保在设置核心转储创建过程中定期检查它。

引用:

https://stackoverflow.com/a/47481884/6702598

这通常是足够的:

ulimit -c unlimited

注意,这不会在ssh部分之间持续存在!要添加持久性:

echo '* soft core unlimited' >> /etc/security/limits.conf

现在,如果你正在使用Ubuntu,“apport”可能正在运行。下面是检查方法:

sudo systemctl status apport.service

如果是,你可能会在以下位置之一找到核心转储:

/var/lib/apport/coredump 
/var/crash

如果您想更改核心转储的位置

确保您拥有创建文件的权限,并且该目录存在于您发送核心转储的目录中!

举个例子。注意,这将不会持续重启:

sysctl -w kernel.core_pattern=/coredumps/core-%e-%s-%u-%g-%p-%t
mkdir /coredumps

确保正在崩溃的进程有权写入该文件。最简单的方法是这样的例子:

chmod 777 /coredumps

测试内核转储是否工作

> crash.c
gcc -Wl,--defsym=main=0 crash.c
./a.out
==output== Segmentation fault (core dumped)

如果上面没有显示“核心转储”,说明有些东西不正常。

默认情况下,您将得到一个核心文件。检查进程的当前目录是否可写,否则不会创建核心文件。

最好使用系统调用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));
}