我已经设置并验证了ulimit:
ulimit -c unlimited
ulimit -a
我还尝试查找名为“core”的文件,但没有得到核心转储文件?
请问哪里可以找到我的核心文件?
ulimit -c unlimited
ulimit -a
我还尝试查找名为“core”的文件,但没有得到核心转储文件?
请问哪里可以找到我的核心文件?
阅读/usr/src/linux/Documentation/sysctl/kernel.txt。
core_pattern
用于指定核心转储文件的模式名称。
- 如果模式的第一个字符是“|”,则内核将把模式的其余部分视为要运行的命令。 核心转储将被写入该程序的标准输入而不是文件中。
你的系统已配置成将核心转储发送到abrt
(意思是:自动漏洞报告工具,而不是“abort”)程序,而不是将其写入磁盘。 自动漏洞报告工具可能没有如文档化那样详细说明。...
无论如何,简单的答案是,你应该能够在/var/cache/abrt
找到核心文件,abrt
在被调用后会将其存储在那里。 同样,使用Apport的其他系统可能会将核心文件存储在/var/crash
等位置。
/var/spool/abrt/
而不是/var/cache/abrt
。 - Nelson/var/lib/systemd/coredump/
目录中。 - Francois/var/lib/systemd/coredump/
。 - Alex/proc/sys/kernel/core_pattern
管道传输到Apport(Ubuntu的崩溃报告系统),这似乎导致了误导性的消息。/var/log/apport.log
中看到这个过程),它会回退到模拟默认内核行为,将核心文件放置在当前工作目录中(这在脚本/usr/share/apport/apport
中完成)。这包括遵守ulimit的规定,在这种情况下它什么也不做。但是(我猜测)就内核而言,已经生成了核心文件(并通过apport管道传输),因此会出现“Segmentation fault (core dumped)”的消息。
最终是PEBKAC(Problem Exists Between Keyboard And Chair,指问题存在于键盘和椅子之间)因为忘记设置ulimit,但误导性的信息让我有一段时间以为自己疯了,想知道是什么在吃我的core文件。
(另外,总的来说,core(5)手册页--man 5 core
--是一个很好的参考,可以了解你的core文件存放在哪里以及可能没有被写入的原因。)
sudo service apport stop
--- 我运行了这个命令后,它把/proc/sys/kernel/core_pattern
从apport管道更改为core
。我想Apport聪明地暂时修复了core_pattern
的设置。 - Patrick Collins随着systemd的推出,还有另一种情况。默认情况下,systemd将在其日志中存储核心转储,并可通过systemd-coredumpctl
命令访问。定义在core_pattern文件中:
$ cat /proc/sys/kernel/core_pattern
|/usr/lib/systemd/systemd-coredump %p %u %g %s %t %e
coredumpctl list
命令(旧的核心转储可能已被自动删除)。
可以通过一种简单的“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
。 - gsgx50-coredump.conf
替代coredump.conf
。这样可以覆盖/lib/sysctl.d/50-coredump.conf
。要恢复默认设置,请使用sysctl -w kernel.core_pattern=core
命令。 - Lekensteynsudo service apport stop
- rahul003systemd-coredump
,然后才能让coredumpctl
命令正常工作。之后就很容易了 ;) - oligofren在 Ubuntu 16.04 LTS 下编写获取核心转储的指令:
如 @jtn 在他的回答中提到的那样,Ubuntu 将崩溃显示委托给 apport,后者拒绝写入转储文件,因为该程序不是已安装软件包。
要解决此问题,我们需要确保 apport 也为 非软件包 程序编写核心转储文件。为此,请创建一个名为~/.config/apport/settings 的文件,并填入以下内容:
[main]
unpackaged=true
现在再次崩溃您的程序,看看生成的崩溃文件是否位于文件夹 /var/crash 中,名称类似于 *.1000.crash。请注意,这些文件不能直接由 gdb 读取。
[可选] 要使转储文件可被 gdb 读取,请运行以下命令:
apport-unpack <location_of_report> <target_directory>
我可以想到以下两种可能性:
正如其他人已经指出的,程序可能会调用chdir()
函数。运行该程序的用户是否被允许写入它所切换到的目录?如果不行,那么就无法创建核心转储。
由于某些奇怪的原因,核心转储文件没有命名为core.*
。您可以通过检查/proc/sys/kernel/core_pattern
来确认这一点。此外,您所提到的 find 命令将无法找到典型的核心转储文件。您应该使用 find / -name "*core.*"
,因为典型的核心转储文件名为core.$PID
。
/proc/sys/kernel/core_pattern
的内容以管道符号 |
开头,则该文件将不会被写入由 core_pattern
定义的文件,而是启动在管道符号后定义的命令,并将核心文件写入该程序的 stdin。之后,完全由程序处理核心文件内容。 - Mikko Rantalainensudo service apport stop
然后重新运行应用程序,你将在当前目录中获得转储文件。
/etc/init.d/apport: 68: /etc/init.d/apport: cannot create /proc/sys/fs/suid_dumpable: Operation not permitted
的错误信息,仍然找不到崩溃文件。我已经设置了ulimit -c unlimited
。有人提到了/proc/sys/kernel/core_pattern
,但我甚至看不到这个文件。还需要做什么? - doraemonhttps://wiki.ubuntu.com/Apport
。 - Nicolas Gong/var/lib/apport/coredump
RHEL
上使用 abrt
时,二进制文件缺少核心转储,请确保 /etc/abrt/abrt-action-save-package-data.conf
文件存在。ProcessUnpackaged = yes
针对 Fedora25,我可以在以下位置找到核心文件:
/var/spool/abrt/ccpp-2017-02-16-16:36:51-2974/coredump
根据 /proc/sys/kernel/core_pattern
,ccpp-2017-02-16-16:36:51-2974"
是模式"%s %c %p %u %g %t %P %"
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
提高核心文件大小的限制