Linux 在/var/crash中没有堆芯转储

Linux 在/var/crash中没有堆芯转储,linux,coredump,Linux,Coredump,我试图了解一点核心转储是如何工作的 我使用test.c文件生成核心转储: #include <stdio.h> void foo() {

我试图了解一点核心转储是如何工作的

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

#include <stdio.h>                                                              

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

int main()                                                                      
{                                                                               
        foo();                                                                  
        return 0;                                                               
}
当我运行/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”一节中说的做,所以我在前面添加了一个哈希符号

'problem_types': ['Bug', 'Package']

但是在所有这些情况下,在/var/cash中找不到核心转储文件,您在计算机中为核心转储文件设置了什么文件大小限制? 您可以使用

$ ulimit -c
如果设置为0,则不会生成CoreDump-这是大多数发行版的默认设置

您可以通过将coredumps设置为“unlimited”或使用特定的文件大小限制来启用它

$ ulimit -c unlimited
该链接包含一个关于为什么不生成coredump的检查表。添加下面的列表,以防将来无法访问链接

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

我也在努力获得CoreDump,而我在ulimit上也遇到了同样的问题。Niranjan建议的特定于会话的设置也不适合我

最后,我找到了解决办法

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

和注销/登录

然后


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

您还应该记住ulimit-c是特定于会话的。因此,如果更改一次并终止会话,则需要再次运行该命令。另外,解决方案不会在所有的外壳上都起作用。我已经试过了。我在编辑中添加了它。我看不出你是如何从“pipe to
apport
”变为对一个不相关目录的权限
/var/crash/
我在互联网上读到apport将核心转储放在/var/crash目录中的
$ ulimit -c unlimited
root - core unlimited
*    - core unlimited
ulimit -c