在 Linux 上创建核心转储

Posted

技术标签:

【中文标题】在 Linux 上创建核心转储【英文标题】:Creating core dumps on Linux 【发布时间】:2009-03-25 08:05:06 【问题描述】:

复制:

generate a core dump in linux

我正在尝试在“Fedora Core release 3 (Heidelberg)”中创建核心转储。

[root@testserver test_core_dump]# uname -a

Linux 测试服务器 2.6.12-1.1381_FC3 #1 Fri Oct 21 03:46:55 EDT 2005 i686 athlon i386 GNU/Linux

我正在关注this 创建核心转储。

问题是,/proc/sys/kernel/suid_dumpable 在这个版本中不存在。我也在这里检查了 /proc/sys/fs/suid_dumpable,但 suid_dumpable 不存在。

1) 有什么解决办法吗? 2) 我在这里遗漏了什么吗?

【问题讨论】:

【参考方案1】:

您遵循的说明只是为了覆盖可能阻止您获得核心转储的操作系统限制。

核心转储的生成是一个微不足道的过程,您向该过程发送信号如下

kill -ABRT pid_of_process

但是有很多事情可能会阻止这种情况发生,但是您应该先尝试一下,看看它是否会在您的当前目录中产生核心转储。如果程序是交互式的并且不捕获退出信号,那么您可以通过向进程发送 SIGQUIT 来导致核心转储,这通常绑定到 CTRL-\

您在参考文档中遇到问题的区域是指运行 setuid/setguid 的进程,如果您的进程未在这两种模式下运行,那么您可以放心地忽略该步骤。 (您可以通过查看程序的文件权限并检查 setuid 和 setguid 位来判断进程是否正在运行 setuid/setguid,这可以通过发出 ls -l 命令并在第 4 位(setuid)中查找 s 来完成或第 7 位(setgid)(下面的 setuid 示例)

-r-sr-xr-x 1 root wheel 57616 28 Oct 03:28 /usr/bin/login

您是否尝试过在不使用不起作用的步骤的情况下生成核心并且它起作用了?

您将需要能够写入进程正在运行的目录,或者如果该目录不是当前目录,则为核心转储定义的目录。以 root 身份运行可能会解决权限问题。

【讨论】:

是的,你是对的。这无需设置 suid_dumpable 即可工作。感谢您的帮助:)。【参考方案2】:

我不确定我是否明白你想要什么。您引用的网页谈论启用核心转储,而不是触发它们。不用担心缺少 sysctl——我的 Linux 系统也没有它,我可以愉快地转储核心 :) 你想为特定进程创建核心转储吗?

除了SIGABRT,你也可以试试gcore

姓名 gcore - 为正在运行的进程生成核心文件

概要 gcore [-o 文件名] pid

描述 gcore 为其进程 ID pid 指定的进程生成一个核心文件。默认情况下,核心文件被写入当前目录中的 core.pid。

【讨论】:

我有一个程序崩溃了,它崩溃后我想知道堆栈跟踪。 coredump 可以给我。我试图在程序启动之前启用它,这样一旦程序崩溃,我就会知道它到底在哪里崩溃。这就是我要在这里实现的目标。【参考方案3】:

这是this question 的副本。 accepted answer 和 one with most votes 建议如下:

在 Bash 中:

ulimit -c unlimited

在 tcsh 中:

limit coredumpsize unlimited

在这种情况下,如果程序崩溃,核心转储将在程序运行的名为core 的文件中创建。

【讨论】:

是的,ulimit -c unlimited 足以进行核心转储。但是它在哪里创建 coredump? 核心转储将在运行程序的名为 core 的文件中创建。 不完全是。如果您以这种方式进行配置,则可以在特定目录中创建核心转储。检查 /proc/sys/kernel/core_pattern 看看是否是您的情况。

以上是关于在 Linux 上创建核心转储的主要内容,如果未能解决你的问题,请参考以下文章

Linux:段错误(核心已转储) Segmentation fault (core dumped)(在Linux上如何得到一个段错误的核心转储)(笔记)(未完成,暂停)

即使进程正常运行,如何创建核心转储? [复制]

核心转储已创建,但未写入文件?

在 Linux 上使用核心转储和 gdb 如何使用近似虚拟内存 (VSZ)?

为 Linux 创建 C 程序时出现浮点异常(核心转储)

Linux核心转储与堆转储?