/ var / crash中没有核心转储

时间:2018-01-10 00:11:44

标签: linux coredump

我试图了解核心转储的工作原理。

我使用test.c文件生成核心转储:

#include <stdio.h>                                                              

void foo()                                                                      
{                                                                               
        int *ptr = 0;                                                           
        *ptr = 7;                                                               
}                                                                               

int main()                                                                      
{                                                                               
        foo();                                                                  
        return 0;                                                               
}

我用

编译
gcc test.c -o test

当我运行./test

时,它给了我以下信息
Segmentation fault (core dumped)

我的档案

/proc/sys/kernel/core_pattern 

包含:

|/usr/share/apport/apport %p %s %c %d %P

我检查过我有权写入目录

/var/crash/

但在核心转储之后,此文件夹中没有任何内容(/ var / crash /)。 我使用的是Linux版本17.04。 你知道这里会出问题吗?

修改

我忘了提到我设置限制:

ulimit -c unlimited

所以输出

ulimit -c

读取:

unlimited

我甚至试图在如何启用apport 部分中执行他们所说的here,所以我在

前添加了一个哈希符号
'problem_types': ['Bug', 'Package']

但是所有这些都无法在/ var / cash

中找到核心转储

3 个答案:

答案 0 :(得分:2)

This链接包含无法生成coredump的清单。添加下面的列表以防万一将来无法访问。

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

答案 1 :(得分:0)

您为机器中的coredump设置了哪些文件大小限制? 您可以使用

进行检查
$ ulimit -c

如果设置为0,则不会生成任何coredump - 这是大多数发行版中的默认设置。

您可以通过将coredump设置为&#39; unlimited&#39;来启用它们。或使用特定的文件大小限制。

$ ulimit -c unlimited

答案 2 :(得分:0)

我也在努力获取coredumps,而ulimit也有同样的问题。 Niranjan建议的特定于会话的设置对我也不起作用。

最后,我在https://serverfault.com/questions/216656/how-to-set-systemwide-ulimit-on-ubuntu找到了解决方案

/etc/security/limits.conf 中添加:

root - core unlimited
*    - core unlimited

然后注销/登录。

然后

ulimit -c

终端上的应该返回“ unlimited”,并生成核心转储。