2

我试图得到一个核心转储,所以我使用:

ulimit -c unlimited

我在后台运行程序,然后将其杀死:

kill -SEGV %1

但我只是得到:

[1]+  Exit 1                  ./Test

并且没有创建核心转储。我对其他程序做了同样的事情并且它有效,那么为什么这对所有程序都不起作用?任何人都可以帮助我吗?

谢谢。(GNU/Linux, Debian 2.6.26)

4

3 回答 3

2

如果您的程序捕获 SEGV 信号并执行其他操作,它将不会调用 OS 核心转储例程。检查它是否没有这样做。

在 Linux 下,出于安全原因,使用 setuid、seteuid 或其他一些参数更改其用户 ID 的进程将被排除在转储核心之外(想想:/bin/passwd 在将 /etc/shadow 读入内存时转储核心)

您可以通过在更改 UID 后调用 prctl() 在更改其用户 ID 的 Linux 程序上重新启用转储核心

于 2010-05-13T16:12:09.883 回答
0

此外,您可能想检查您正在运行的程序是否没有更改其工作目录( chdir() ),因为这样它将在与您运行它的目录不同的目录中创建核心文件。

你也可以试试这个:

kill -ABRT pid 
于 2010-05-14T10:46:41.117 回答
0

尝试(作为根):

sysctl kernel.core_pattern=core

然后重复你的实验。在某些系统上,该变量/dev/null默认设置为。

但是,如果您看到退出状态 1,则程序可能确实拦截了信号。

于 2010-07-16T21:23:57.700 回答