Linux:如何生成核心文件?

4

我正在使用Ubuntu 10.04操作系统。我执行了"ulimit -c 999"命令,然后编译并运行(gcc test.c && ./a.out)这个小程序:

#include <signal.h>

int main( void )
{
    raise( SIGSEGV );

    return 0;
}

尽管它确实打印出了“分段错误”的消息,但我没有看到核心文件。我错过了什么阻止生成核心文件?

1
先执行 ulimit -c unlimited,然后调用 kill(getpid(), SIGSEGV); - Erik
raise()和kill(getpid())不是一样的吗?而且从我的问题中可以看出,我已经调用了ulimit。 - Stéphane
raise并不完全相同。kill会针对整个进程,而raise则会针对调用raise的线程。此外,当信号被传递时,kill指定为提供SI_USERsi_code,而raise可能会生成不同的代码(在Linux上它会生成SI_TKILL)。 - R.. GitHub STOP HELPING ICE
2个回答

6
ulimit -c unlimited

如何启用核心转储?点击这里了解更多。

编辑:

好的,我明白问题所在了。您的核心文件限制太低了。999字节(您设置的值)是不够的。将其增加到合理的数值。无限制是最好的参数。


@Stéphane 好的,已编辑答案。您的 ulimit 选项太低了。 - BЈовић
超过999的任何内容都会产生“操作不允许”的错误。我按照你提供的链接并以root身份增加了限制。现在它按预期工作,测试应用程序正在记录“分段错误(核心已转储)”。请注意,限制以KB为单位。因此,999表示999KB。我现在已经使用仅9个限制运行了测试,所有我的核心大小均为8KB。(在那种大小下很可能无法使用,但这是另一个话题。) - Stéphane

0
使用ulimit命令和-c标志来控制允许的核心文件最大大小。

3
在回答这个问题的疯狂匆忙中,我认为每个人都忽略了我写的第一句话,即我正在调用ulimit。 - Stéphane
我认为问题出在你指定的限制大小上,你是否尝试过像其他答案建议的“无限制”呢? - trojanfoe
$ ulimit -c unlimited bash: ulimit: 核心文件大小: 无法修改限制: 操作不允许 但是,如果我想使用它,我不想无限制。由于磁盘空间非常有限,我需要在必要时截断核心大小。 - Stéphane
好的,你需要成为root用户才能设置无限制的核心文件大小,最重要的是截断的核心文件根本没有任何用处。因此,问题似乎是找到一个非root用户允许设置的大小,并且足够大以容纳核心文件,以便进行调试。 - trojanfoe
1
不要假设截断的核心文件没有用处。如果您的应用程序分配了大量的RAM(比如50GB),那么您的核心文件将非常庞大。通过限制大小,您仍然可以从核心中收集一些信息,同时防止绝对巨大的文件填满有限的磁盘空间。在某些情况下,比如我所面临的情况,这可能会帮助很大。 - Stéphane

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