核心已转储,但核心文件不在当前目录下?

364
在运行C程序时,它会显示“(core dumped)” ,但我在当前路径下找不到任何文件。
我已经设置并验证了ulimit:
ulimit -c unlimited 
ulimit -a 

我还尝试查找名为“core”的文件,但没有得到核心转储文件?
请问哪里可以找到我的核心文件?


1
程序是否在某个时刻调用了chdir函数?如果是的话,请查看那里。 - William Pursell
2
程序是否更改其工作目录?请查看那里。 - Richard Pennington
1
哎呀,它不在那里...我检查了一下。将程序目录更改为/mnt和/,我检查了这两个目录,但是找不到该文件。我甚至执行了find / -name "*core.",但是仍然没有找到该文件。该程序使用C + sqlite,在插入值时会出现核心转储。第一次它说断言错误==0,第二次则是错误=101。 - webminal.org
9
如果你用以“/tmp”开头的字符串覆盖“/proc/sys/kernel/core_pattern”,那么你的核心转储文件将会被存储在/tmp目录下。 - ephemient
显示剩余3条评论
15个回答

6
我的WSL尝试没有成功。
对于那些在Windows子系统Linux(WSL)上运行的人来说,目前存在一个缺少核心转储文件的问题。
评论指出:
“这是我们知道的一个已知问题,我们正在调查。” Github问题 Windows开发者反馈

6

在我的情况下,原因是ulimit命令只对当前终端有效。

如果我在第一个终端设置了ulimit -c unlimited,然后开启一个新的终端运行程序,当程序core dump时就不会生成核心文件。

您需要确认运行程序的终端的核心大小。

以下步骤适用于Ubuntu 20.04和Ubuntu 21.04:

  1. 停止Apport服务
sudo service apport stop

设置准备运行程序的终端的核心大小。
ulimit -c unlimited

3

ulimit -c unlimited命令会在 "core dumped" 后,在当前目录下正确地生成 core 文件。


3
如果您使用的是 Fedora,为了在二进制文件所在目录生成核心转储文件:
echo "core.%e.%p" > /proc/sys/kernel/core_pattern

并且

ulimit -c unlimited

这本身是没问题的,但如果你想要与现有的系统设置一起工作,而不是反其道而行之,那么请尝试弄清楚它是如何设置的,并检查文档以获取捕获转储的命令。详情请参见 https://dev59.com/uHI95IYBdhLWcg3w-DL0#14082174。 - oligofren

0
一行代码获取最新的核心转储路径:
ls -t $(cat /proc/sys/kernel/core_pattern | awk -F% '{print $1"*"}') 2>/dev/null | head -1

你当然可以修改该行上的最后一个-1为例如-4,以获取最后四个核心转储。

注意: 如果路径模式在最后一个/之前使用变量或者在该目录下存在非内核转储文件,则预计无法正常工作。


1
或者你可以直接使用coredumpctl -1 info - undefined

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