未生成核心转储文件

新手上路,请多包涵

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

 #!/bin/bash
ulimit -c unlimited
while true; do ./server; done

如您所见,我正在使用 ulimit -c unlimited 如果我想生成核心转储,这很重要,但是当我遇到分段错误时它仍然不会生成它。我怎样才能让它工作?

原文由 Cyclone 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 669
2 个回答

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

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

原文由 Employed Russian 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

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

原文由 Philipp Claßen 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题