未生成核心转储文件

Cyc*_*one 54 linux gdb coredump

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

#!/bin/bash
ulimit -c unlimited
while true; do ./server; done
Run Code Online (Sandbox Code Playgroud)

如你所知,我正在使用ulimit -c unlimited哪个是重要的,如果我想生成核心转储,但是当我遇到分段错误时它仍然没有生成它.我怎样才能使它工作?

Phi*_*ßen 53

此链接包含一个很好的清单,为什么不生成核心转储:

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

  • 要添加一件事:当程序调用`setuid()`例如删除root权限时,它不再是可核心转储的(可执行文件不必是suid).在Linux 3.12上使用默认的Arch Linux配置进行测试.我不知道为什么会这样,它在任何地方都没有文件化.在`setuid`之后调用`prctl(PR_SET_DUMPABLE,1,...)`修复了这个问题,因此它不是文件系统权限问题. (6认同)
  • 另外:如果应用程序为`SIGSEGV`设置信号处理程序,那么没有进一步的技巧(参见http://stackoverflow.com/questions/16697361)将不会创建核心转储. (3认同)
  • 实际上,这是在PR_SET_DUMPABLE部分的prctl手册页上记录的:http://man7.org/linux/man-pages/man2/prctl.2.html (2认同)

Emp*_*ian 51

确保您当前的目录(在崩溃时 - server可能更改目录)是可写的.如果服务器调用setuid,该目录必须是该用户可写的.

还检查一下/proc/sys/kernel/core_pattern.这可能会将核心转储重定向到另一个目录,并且目录必须是可写的.更多信息在这里.

  • 是的,core_pattern很棘手.当Arch Linux切换到systemd时,我遇到了这个问题.现在我使用`echo"core">/proc/sys/kernel/core_pattern`按预期获取我的核心转储(默认情况下它被写入systemd-journal).你可以花很多时间来弄明白...... (13认同)

小智 8

对于systemd系统1,安装软件包systemd-coredump。Coredump 可以通过以下方式找到:

ls /var/lib/systemd/coredump
Run Code Online (Sandbox Code Playgroud)

此外,这些核心转储以lz4格式压缩。解压缩,您可以使用包liblz4-tool这样的:lz4 -d FILE。为了能够使用 调试解压缩的核心转储gdb,我还必须将完全长的文件名重命名为更短的名称...

1 Debian 9 伸展

  • 您可以使用命令“coredumpctl list”查看是否已生成核心转储。 (3认同)

use*_*853 6

请记住,如果您是从服务启动服务器,它将启动另一个bash会话,因此ulimit在那里无效。尝试将其放在脚本本身中

ulimit -c unlimited
Run Code Online (Sandbox Code Playgroud)


ken*_*orb 5

校验:

$ sysctl kernel.core_pattern
Run Code Online (Sandbox Code Playgroud)

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

如果您使用的是Ubuntu,您的转储是由apportin 创建的/var/crash,但格式不同(编辑文件以查看它).

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

sleep 10 &
killall -SIGSEGV sleep
Run Code Online (Sandbox Code Playgroud)

如果核心转储成功,您将在分段故障指示后看到"(core dumped)".

阅读更多:

如何在Ubuntu中生成核心转储文件


Ubuntu的

请阅读更多:

https://wiki.ubuntu.com/Apport