在/var/crash中没有核心转储。

6
我正在尝试了解核心转储的工作原理。
我使用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部分所说的去做,所以我在前面加了一个井号。
'problem_types': ['Bug', 'Package']

但是尽管如此,核心转储文件仍无法在 /var/cash 中找到。

我不明白你是如何从“管道到apport”再到一个无关目录/var/crash/的权限的。 - tripleee
我在互联网上读到,apport将核心转储放在/var/crash目录中。 - roi_saumon
3个回答

3

这个链接包含了一个关于为什么没有生成核心转储文件的检查清单。以下是列表内容,以防将来链接无法访问。

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

1

我也曾为获取核心转储而苦苦挣扎,也遇到了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

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

0

在您的机器上,您设置了什么核心转储文件大小限制? 您可以使用以下方式进行检查:

$ ulimit -c

如果将其设置为0,则不会生成核心转储文件 - 这是大多数发行版的默认设置。

您可以通过将其设置为“无限制”或使用特定的文件大小限制来启用核心转储文件。

$ ulimit -c unlimited

您还需要注意,ulimit -c是会话特定的。因此,如果您更改了它并终止了会话,则需要再次运行该命令。此外,解决方案不适用于所有的 shells。 - Mayank Jain
谢谢Niranjan,我已经尝试过了。我已经在编辑中添加了它。 - roi_saumon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接