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