在运行C程序时,它显示“((核心转储)”),但是在当前路径下看不到任何文件。
我已经设置并验证了ulimit
:
ulimit -c unlimited
ulimit -a
我也试图找到一个名为“ core”的文件,但是没有得到core dumped文件?
任何帮助,我的核心文件在哪里?
/proc/sys/kernel/core_pattern
使用以开头的字符串覆盖,/tmp
那么核心转储就将在那里。
在运行C程序时,它显示“((核心转储)”),但是在当前路径下看不到任何文件。
我已经设置并验证了ulimit
:
ulimit -c unlimited
ulimit -a
我也试图找到一个名为“ core”的文件,但是没有得到core dumped文件?
任何帮助,我的核心文件在哪里?
/proc/sys/kernel/core_pattern
使用以开头的字符串覆盖,/tmp
那么核心转储就将在那里。
Answers:
阅读/usr/src/linux/Documentation/sysctl/kernel.txt。
[/ proc / sys / kernel /] core_pattern用于指定核心转储文件模式名称。
- 如果模式的第一个字符是'|',则内核会将模式的其余部分视为要运行的命令。核心转储将被写入该程序的标准输入,而不是文件。
无需将核心转储写入磁盘,而是将系统配置为将其发送到abrt
程序。 自动化的错误报告工具可能没有应有的文档记录。
无论如何,快速的答案是您应该能够在中找到核心文件/var/cache/abrt
,在abrt
调用后将其存储在此处。同样,使用Apport的其他系统可能会松散中的核心/var/crash
,依此类推。
/var/spool/abrt/
而不是/var/cache/abrt
/var/lib/systemd/coredump/
在最近的Ubuntu(在我的案例中为12.04)上,可能会打印“段错误(核心已转储)”,但可能没有一个您期望的核心文件生成(例如,本地编译程序)。
如果您的核心文件大小ulimit为0(尚未完成ulimit -c unlimited
),则可能会发生这种情况-这是Ubuntu上的默认设置。通常,这会抑制“(核心转储)”,使您误入歧途,但是在Ubuntu上,核心文件通过管道传输到Apport(Ubuntu的崩溃报告系统)/proc/sys/kernel/core_pattern
,这似乎会引起误解。
如果Apport发现所讨论的程序不是一个程序,则应该报告崩溃的情况(您可以在中看到情况/var/log/apport.log
),它会退回到模拟将内核文件放入cwd中的默认内核行为(这在脚本中完成)/usr/share/apport/apport
)。这包括遵守ulimit,在这种情况下,它不执行任何操作。但是(就我而言),就内核而言,生成了一个核心文件(并通过管道进行分配),因此消息为“分段错误(核心已转储)”。
最终PEBKAC忘记设置ulimit,但是这个误导性消息让我觉得我发疯了一段时间,想知道是什么在吞噬我的核心文件。
(此外,通常,core(5)手册页-- man 5 core
是核心文件最终存放位置以及可能无法写入的原因的很好参考。)
sudo service apport stop
---在我运行该方法后将其/proc/sys/kernel/core_pattern
从apport管道更改为just core
。core_pattern
我想,Apport足够聪明,可以暂时解决问题。
随着systemd的推出,还有另一种情况。缺省情况下,systemd会将核心转储存储在其日志中,可通过systemd-coredumpctl
命令进行访问。在core_pattern文件中定义:
$ cat /proc/sys/kernel/core_pattern
|/usr/lib/systemd/systemd-coredump %p %u %g %s %t %e
可以通过简单的“ hack”禁用此行为:
$ ln -s /dev/null /etc/sysctl.d/50-coredump.conf
$ sysctl -w kernel.core_pattern=core # or just reboot
与往常一样,核心转储的大小必须等于或大于要转储的核心的大小,例如,例如ulimit -c unlimited
。
ulimit -c unlimited
。
50-coredump.conf
代替coredump.conf
。这应该覆盖/lib/sysctl.d/50-coredump.conf
。可以使用sysctl -w kernel.core_pattern=core
sudo service apport stop
编写说明以在Ubuntu 16.04 LTS下获得核心转储:
正如@jtn在回答中提到的那样,Ubuntu将崩溃的显示委托给apport,因为该程序不是已安装的程序包,所以转而拒绝编写转储。
要解决此问题,我们需要确保apport也为非打包程序写入核心转储文件。为此,请创建一个名为〜/ .config / apport / settings的文件,其内容如下:
[main]
unpackaged=true
[可选]要使gdb使转储可读,请运行以下命令:
apport-unpack <location_of_report> <target_directory>
我可以想到以下两种可能性:
正如其他人已经指出的那样,该程序可能会chdir()
。运行该程序的用户是否被允许写入其目录chdir()
?如果不是,它将无法创建核心转储。
由于某些奇怪的原因,核心转储没有命名,core.*
您可以检查/proc/sys/kernel/core_pattern
一下。另外,您命名的find命令不会找到典型的核心转储。您应该使用find / -name "*core.*"
,因为coredump的典型名称是core.$PID
如果RHEL
在使用时以及使用时缺少二进制文件的核心转储abrt
,请确保/etc/abrt/abrt-action-save-package-data.conf
包含
ProcessUnpackaged = yes
这样就可以为不属于已安装软件包(例如,本地构建的软件包)的二进制文件创建崩溃报告(包括核心转储)。
我在WSL中的努力一直没有成功。
对于在Linux的Windows子系统(WSL)上运行的应用程序,目前似乎缺少核心转储文件是一个未解决的问题。
评论表明
这是我们已知的已知问题,我们正在调查中。
我使用的是Linux Mint 19(基于Ubuntu 18)。我想coredump
在当前文件夹中保存文件。我必须做两件事:
/proc/sys/kernel/core_pattern
(按# echo "core.%p.%s.%c.%d.%P > /proc/sys/kernel/core_pattern
或按# sysctl -w kernel.core_pattern=core.%p.%s.%c.%d.%P)
$ ulimit -c unlimited
那已经写在答案中了,但是我写得很简洁。有趣的是,更改限制不需要root特权(根据/ubuntu/162229/how-do-i-increase-the-open-files-limit-for-a-non-root-user non- root只能降低该限制,因此这是意外的-欢迎对此发表评论)。
ulimit -c unlimited
使核心文件在“核心转储”之后正确显示在当前目录中。