linux - 未生成核心转储文件

标签 linux gdb coredump

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

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

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

最佳答案

This link包含一个很好的 list ,为什么不生成核心转储:

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

关于linux - 未生成核心转储文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7732983/

相关文章:

在 Cygwin 上创建核心转储

c - Spin Loop 在缓存一致性方面的开销

使用 pthread 时,使用全局变量的 C++ 显示比指针慢 100%?

c - 调试段错误——程序总是按它应该的方式运行,但总是出现段错误

gdb - 如何判断我在 gdb 中是处于 ARM 模式还是 Thumb 模式?

Linux内核: sequence of events/paths before process coredump happens

c - Linux C定义缓冲区

linux - 对不受信任的源代码的编译和执行进行沙箱化的架构

c++ - 在 GDB 中查看 GCC 优化中间体?

c++ - 如何计算预期的核心文件大小