崩溃后未创建进程核心转储

Posted

技术标签:

【中文标题】崩溃后未创建进程核心转储【英文标题】:Process Core dumps are not created after crash 【发布时间】:2014-10-18 06:43:26 【问题描述】:

我已配置系统配置以创建进程核心转储。

以下是我的配置。

/etc/sysctl.conf
    kernel.core_uses_pid = 1
    kernel.core_pattern = /var/core/core.%e.%p.%h.%t
    fs.suid_dumpable = 2

/etc/security/limits.conf
    *               soft    core    unlimited
    root            soft    core    unlimited

这是我生成进程核心转储的步骤。

1) 我已经重启了mysql服务并执行了命令“kill -s SEGV <mysql_pid>”然后我在/var/core位置得到了核心转储文件。

2) 然后我已经启动了我的服务mysql说"/etc/init.d/mysql start""service mysql start"。现在,如果我给出“kill -s SEGV <mysql_pid>”,则不会创建核心转储文件。

3) 要再次获取崩溃文件,我必须重新启动 mysql 服务,然后只有当我给出“kill -s SEGV <mysql_pid>”时,我才能获取核心转储文件。

谁能帮我解决这个问题?

【问题讨论】:

【参考方案1】:

首先,您可以通过运行以下命令来验证 MySQL 进程是否禁用了核心转储:

# cat /proc/`pidof -s mysqld`/limits|egrep '(Limit|core)'
Limit                     Soft Limit           Hard Limit           Units
Max core file size        0                    unlimited            bytes

“软”限制是要查找的限制,在这种情况下为零表示禁用核心转储。

在 /etc/security/limits.conf 中默认设置的限制仅适用于交互式启动的程序。您可能必须在 mysqld 启动脚本中包含“ulimit -c unlimited”才能永久启用核心转储。

如果你幸运的话,你可以为你当前的 shell 启用 coredumps 并使用它的 init.d 脚本重新启动守护进程:

# ulimit -c unlimited
# /etc/init.d/mysql restart
 * Stopping MySQL database server mysqld               [ OK ] 
 * Starting MySQL database server mysqld               [ OK ] 
 * Checking for tables which need an upgrade, are corrupt
   or were not closed cleanly.
# cat /proc/`pidof -s mysqld`/limits|egrep '(Limit|core)'
Limit                     Soft Limit           Hard Limit           Units
Max core file size        unlimited            unlimited            bytes

如您所见,这适用于我系统上的 MySQL。

请注意,这不适用于像 Apache 这样在内部调用 ulimit 以禁用核心转储的应用程序,不适用于使用 upstart 的 init.d 脚本。

【讨论】:

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

在 macOS Sierra 中为崩溃的进程启用核心转储

从附加到 ddd/dbx 的崩溃进程生成核心转储

macOS Big Sur 中的分段错误后未生成核心转储文件

Linux 中的核心转储

生成子进程的核心转储文件

杀死进程而不创建核心转储?