每次我的应用程序崩溃时,都不会生成核心转储文件。我记得几天前,在另一台服务器上 生成了它。我正在使用 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/