我试图找出我的一个 Linux 应用程序崩溃的原因。但我不知道核心在哪里。
cat /proc/sys/kernel/core_pattern
core.%e.%p
Run Code Online (Sandbox Code Playgroud)
任何的想法?
我正在寻找一种方法来删除coredumpctl list. 目前它列出了从 2014 年 12 月 14 日开始的核心转储 - 从那时到现在,我经常更新软件,以至于我怀疑那些旧的核心转储现在是否会帮助我调试任何问题。不幸的是,删除文件/var/lib/systemd/coredump只会使 coredumpctls 输出的“PRESENT”列中的星号消失。
我找不到任何方法来删除联机帮助页或 coredumpctl 的帮助输出中有关 coredump 的所有信息。
当 Linux 出现段错误时,Segmentation fault (core dumped)会在终端(如果有)打印错误信息,并终止程序。作为 C/C++ 开发人员,这种情况经常发生在我身上,我通常会忽略它并转到gdb,重新创建我之前的操作以再次触发无效的内存引用。相反,我想我也许可以改用这个“核心”,因为一直运行gdb是相当乏味的,而且我不能总是重新创建分段错误。
我的问题是三个:
我想在调试程序时查看核心文件的内容。如何查看核心文件的内容?
我在 CentOS 6 上,试图为我正在开发的应用程序启用核心转储。我已经把:
ulimit -H -c unlimited >/dev/null
ulimit -S -c unlimited >/dev/null
Run Code Online (Sandbox Code Playgroud)
在我的 bash 配置文件中,但仍未生成核心转储(在新终端中)。
我还更改了我的 /etc/security/limits.conf 以便所有用户的软限制为零。
如何设置要输出的核心文件的位置?我想指定位置并附加生成转储的时间,作为文件名的一部分?
我设置了我的环境以创建所有崩溃的核心转储,但是当我在与执行用户不同的用户上运行设置了 SUID 的程序时,它不会创建核心转储。知道为什么会这样吗?我在网络上的任何地方都找不到它,我认为这是某种安全功能,但我想禁用它...
问题:
$ cd /tmp
$ cat /etc/security/limits.conf | grep core
* - core unlimited
root - core unlimited
$ ls -l ohai
-rwsr-sr-x 1 root root 578988 2011-06-23 23:29 ohai
$ ./ohai
...
Floating point exception
$ sudo -i
# ./ohai
...
Floating point exception (core dumped)
# chmod -s ohai
# exit
$ ./ohai
...
Floating point exception (core dumped)
Run Code Online (Sandbox Code Playgroud)
编辑: 为了让它尽可能安全地工作,我现在有以下脚本来设置环境:
mkdir -p /var/coredumps/
chown root:adm /var/coredumps/
chmod 772 /var/coredumps/
echo "kernel.core_pattern = /var/coredumps/core.%u.%e.%p" >> …Run Code Online (Sandbox Code Playgroud) 有没有办法在不实际杀死进程的情况下为进程获取核心转储(或类似的东西)?我有一个在嵌入式系统上运行的多线程 python 进程。而且我希望能够在正常条件下(即需要运行其他进程)获得进程的快照,但是我没有足够的内存来连接 gdb(或在 gdb 下运行它)而没有 python 进程作为唯一一个运行。
我希望这个问题是有道理的。
当我执行我正在处理的程序时,它失败并显示以下消息:
...
Aborted (core dumped)
Run Code Online (Sandbox Code Playgroud)
但是,不会创建核心转储。核心转储是以前写的,我不记得我改变了任何与它相关的东西。
当我跑ulimit -a回来时,
$ ulimit -a
core file size (blocks, -c) unlimited
...
Run Code Online (Sandbox Code Playgroud)
其他点,
/proc/sys/fs/suid_dumpable。目前,它在我的机器上设置为 0。我试图将其更改为 1 或 2,但没有区别。不幸的是,我不记得我什么时候可以生成最后一次成功的核心转储。
我正在使用核心转储进行调试,请注意 gdb 需要您提供可执行文件和核心转储。为什么是这样?如果核心转储包含进程使用的所有内存,那么核心转储中不包含可执行文件吗?也许不能保证整个 exe 被加载到内存中(尽管单个可执行文件通常没有那么大),或者核心转储毕竟不包含所有相关内存?是用于符号吗(也许它们没有正常加载到内存中)?
生成 coredumps 过去工作正常,但切换到 systemd 后,我只看到消息
Aborted (core dumped)
Run Code Online (Sandbox Code Playgroud)
但没有core生成文件。和systemd有关系吗?
(背景:我的原始问题可以在这里找到。感谢 schaiba 找到解决方案。我提供了这个问答,所以如果其他人已经知道这是一个系统问题,他们可以更容易地找到解决方案。)