我试图得到一个核心转储,所以我使用:
ulimit -c unlimited
我在后台运行程序,然后将其杀死:
kill -SEGV %1
但我只是得到:
[1]+ Exit 1 ./Test
并且没有创建核心转储。我对其他程序做了同样的事情并且它有效,那么为什么这对所有程序都不起作用?任何人都可以帮助我吗?
谢谢。(GNU/Linux, Debian 2.6.26)
如果您的程序捕获 SEGV 信号并执行其他操作,它将不会调用 OS 核心转储例程。检查它是否没有这样做。
在 Linux 下,出于安全原因,使用 setuid、seteuid 或其他一些参数更改其用户 ID 的进程将被排除在转储核心之外(想想:/bin/passwd 在将 /etc/shadow 读入内存时转储核心)
您可以通过在更改 UID 后调用 prctl() 在更改其用户 ID 的 Linux 程序上重新启用转储核心
此外,您可能想检查您正在运行的程序是否没有更改其工作目录( chdir() ),因为这样它将在与您运行它的目录不同的目录中创建核心文件。
你也可以试试这个:
kill -ABRT pid
尝试(作为根):
sysctl kernel.core_pattern=core
然后重复你的实验。在某些系统上,该变量/dev/null
默认设置为。
但是,如果您看到退出状态 1,则程序可能确实拦截了信号。