Linux 未生成核心转储文件

Linux 未生成核心转储文件,linux,gdb,coredump,Linux,Gdb,Coredump,每次应用程序崩溃时,都不会生成核心转储文件。我记得几天前,它是在另一台服务器上生成的。我在bash中使用screen运行应用程序,如下所示: #!/bin/bash ulimit -c unlimited while true; do ./server; done 如您所见,我使用的是ulimit-c unlimited,如果我想生成核心转储,这一点很重要,但当我遇到分段错误时,它仍然无法生成。 如何使其工作?确保当前目录(崩溃时--服务器可能会更改目录)可写。如果服务器调用setuid,则该

每次应用程序崩溃时,都不会生成核心转储文件。我记得几天前,它是在另一台服务器上生成的。我在bash中使用screen运行应用程序,如下所示:

#!/bin/bash
ulimit -c unlimited
while true; do ./server; done
如您所见,我使用的是
ulimit-c unlimited
,如果我想生成核心转储,这一点很重要,但当我遇到分段错误时,它仍然无法生成。
如何使其工作?

确保当前目录(崩溃时--
服务器
可能会更改目录)可写。如果服务器调用
setuid
,则该用户必须能够写入目录


同时检查
/proc/sys/kernel/core\u模式
。这可能会将核心转储重定向到另一个目录,并且该目录必须是可写的。更多信息。

此外,请检查以确保在
/var/core
或写入核心转储的任何位置上有足够的磁盘空间。如果分区已满或磁盘使用率为100%,那么这就是问题所在。我的核心转储平均数为几GB,因此您应该确保分区上至少有5-10 GB可用。

包含一个很好的检查表,说明为什么不生成核心转储:

  • 堆芯将大于当前的限制
  • 您没有转储核心(目录和文件)所需的权限。请注意,核心转储放在转储进程的当前目录中,该目录可能与父进程不同
  • 验证文件系统是否可写,是否有足够的可用空间
  • 如果工作目录中存在名为core的子目录,则不会转储core
  • 如果名为core的文件已经存在,但有多个硬链接,内核将不会转储core
  • 验证可执行文件的权限,如果可执行文件启用了suid或sgid位,则默认情况下将禁用核心转储。如果您对该文件具有执行权限,但没有读取权限,则情况也是如此
  • 验证进程是否未更改工作目录、内核大小限制或可转储标志
  • 某些内核版本无法转储具有共享地址空间(又名线程)的进程。较新的内核版本可以转储此类进程,但会将pid附加到文件名
  • 可执行文件可以是不支持核心转储的非标准格式。每个可执行格式必须实现一个核心转储例程
  • 分段错误实际上可能是内核Oops,请检查系统日志中是否有Oops消息
  • 应用程序调用了
    exit()
    ,而不是使用核心转储处理程序
检查:

$ sysctl kernel.core_pattern
要查看转储是如何创建的(%e将是进程名称,%t将是系统时间)

如果你有Ubuntu,你的转储文件是由
/var/crash
中的
apport
创建的,但格式不同(编辑文件查看)

您可以通过以下方式进行测试:

sleep 10 &
killall -SIGSEGV sleep
如果堆芯倾倒成功,在分段故障指示后,您将看到“(堆芯倾倒)”

阅读更多:


Ubuntu

详情请浏览:


尽管这对提问者来说不是问题,因为他们运行的程序是用ulimit命令生成脚本中的核心文件,但我想记录ulimit命令特定于运行它的shell(如环境变量)。我花了太多的时间在一个shell中运行ulimit和sysctl等,并在另一个shell中运行我想转储core的命令,我想知道为什么没有生成core文件


我将把它添加到我的bashrc中。sysctl一经发布就适用于所有进程,但ulimit只适用于发布它的shell(可能也适用于其后代),而不适用于正在运行的其他shell。

注意:如果您自己编写了任何崩溃处理程序,则可能无法生成内核。因此,在代码行中搜索某些内容:

signal(SIGSEGV, <handler> );
信号(SIGSEGV,);

因此,SIGSEGV将由处理程序处理,您将无法获得核心转储

请记住,如果从服务启动服务器,它将启动不同的bash会话,因此ulimit在那里无效。尝试将此内容放入脚本本身中:

ulimit -c unlimited

这里给出的答案涵盖了大多数没有创建核心转储的场景。然而,在我的例子中,这些都不适用。我把这个答案作为其他答案的补充

如果由于任何原因没有创建核心文件,我建议查看/var/log/messages。这里可能有一个提示,说明为什么没有创建核心文件。就我而言,有一行文字说明了根本原因:

Executable '/path/to/executable' doesn't belong to any package
要解决此问题,请编辑/etc/abrt/abrt-action-save-package-data.conf并将processunpackage从“否”更改为“是”

ProcessUnpackaged = yes

此设置指定是否为未随package manager一起安装的二进制文件创建核心

如果调用某个进程并对其进行后台监控,默认情况下,当前工作目录将更改为
/
。因此,如果您的程序是守护进程,那么您应该在
/
目录中而不是二进制文件目录中查找内核。

如果某个内核位于Linux发行版(例如CentOS、Debian)上,那么查找核心文件和相关条件的最容易访问的方法可能是在手册页中。只需从终端运行以下命令:

man 5 core

为了记录在案,在Debian9Stretch(
systemd
)上,我必须安装包
SystemdCoreDump
。之后,在文件夹
/var/lib/systemd/coredump
中生成了核心转储

此外,这些coredump以
lz4
格式压缩。要解压缩,您可以像这样使用包
liblz4工具
lz4-d文件

为了能够使用
gdb
调试解压缩的coredump,我