我有一个进程在Linux得到一个分割错误。当它失败时,我如何告诉它生成一个核心转储?
当前回答
这通常是足够的:
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)
如果上面没有显示“核心转储”,说明有些东西不正常。
其他回答
最后我所做的是在进程崩溃之前将gdb附加到进程,然后当它出现段错误时,我执行generate-core-file命令。强制生成核心转储。
默认情况下,您将得到一个核心文件。检查进程的当前目录是否可写,否则不会创建核心文件。
要检查内核转储是在哪里生成的,运行:
sysctl kernel.core_pattern
or:
cat /proc/sys/kernel/core_pattern
其中%e为进程名,%t为系统时间。您可以在/etc/sysctl.conf中修改它,并通过sysctl -p重新加载。
如果没有生成核心文件(通过:sleep 10 &和killall -SIGSEGV sleep进行测试),则通过:ulimit -a检查限制。
如果你的核心文件大小有限,运行:
ulimit -c unlimited
让它无限。
然后再次测试,如果核心转储成功,你会看到“(核心转储)”分割故障指示如下:
分段故障:11(核心转储)
请参见:核心转储-但核心文件不在当前目录?
Ubuntu
在Ubuntu中,核心转储由Apport处理,可以位于/var/crash/。但是,在稳定版本中默认禁用它。
更多细节,请查看:我在哪里找到Ubuntu的核心转储?
操作系统
对于macOS,请参阅:如何在Mac OS X中生成核心转储?
这取决于您使用的shell。如果使用bash,则ulimit命令控制与程序执行相关的几个设置,例如是否应该转储core。如果你输入
ulimit -c unlimited
然后这将告诉bash,它的程序可以转储任何大小的内核。如果你愿意,你可以指定一个大小,比如52M,而不是无限,但在实践中,这不应该是必要的,因为核心文件的大小可能永远不会成为你的问题。
在tcsh中,您需要输入
limit coredumpsize unlimited
这通常是足够的:
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)
如果上面没有显示“核心转储”,说明有些东西不正常。