更改核心转储文件的位置

46

我想要更改核心转储文件的默认位置,以便每次生成核心转储文件时,它都会保存到该目录中。此外,在该位置按崩溃的文件名称保存转储文件是否可行?


1
“发生了什么”版本:https://dev59.com/uHI95IYBdhLWcg3w-DL0? - Ciro Santilli OurBigBook.com
3个回答

81
是的,可以。您可以更改/proc/sys/kernel/core_pattern以定义用于生成核心文件的路径名。有关更多信息,请参见man core
echo '/tmp/core_%e.%p' | sudo tee /proc/sys/kernel/core_pattern    # `tee' instead of > so that
                                                                   # opening happens in the
                                                                   # elevated process

将会导致所有未来的核心转储文件生成在 /tmp 目录下,并以 core_[program].[pid] 命名。


21
对于“tee 技巧”,我给予“+1”的赞同。请注意还有 sysctl 命令,可以使用命令“sysctl -w kernel.core_pattern='/tmp/core_%e.%p'”。该命令的作用是将内核转储文件放置在 /tmp 目录下,文件名格式为“core_进程名.进程 ID”。 - hek2mgl
啊,我只安装了 man,没有安装 man-pages,谢谢 :) - xeruf
如果您需要在.bashrc中添加此行,请使用echo '/tmp/core_%e.%p' | sudo tee /proc/sys/kernel/core_pattern >/dev/null。否则,scp将无法正常工作。 - xnervwang
@mata 我不能...开发机器受到我的公司的控制。对系统文件的任何修改都将被定期还原。 - xnervwang
请注意,在Ubuntu上,/proc/sys/kernel/core_pattern的内容会被自动进程周期性地覆盖,从而破坏您可能进行的任何手动更改。有关如何防止此问题的说明,请单击此处 - dshin
显示剩余4条评论

31
在按照被接受的答案中的指示之前,检查/proc/sys/kernel/core_pattern的内容,看看Redhat abrt系统是否正在使用,这是一个好主意。
-> cat /proc/sys/kernel/core_pattern
|/usr/libexec/abrt-hook-ccpp %s %c %p %u %g %t e

如果已经在使用中,则您已经有一个相当广泛的管理核心文件的方案,您需要在覆盖它之前了解它。
简而言之,abrt:
1. 将核心文件放在这里:/var/spool/abrt/。 2. 具有使用命令abrt-gui启动的GUI。 3. 通过附加有关失败进程的其他信息来增强corefile。 4. 使用此文件进行配置:/etc/abrt/abrt-action-save-package-data.conf
使用它的一个常见障碍是更改配置文件中的此行。
ProcessUnpackaged = no

将其更改为“yes”,以从homebrew进程中捕获核心文件,否则它只会捕获软件包管理器安装的程序的核心文件。

[编辑回答如何使用coredump] 要检查核心转储,我执行以下操作:

cd /var/spool/abrt/XXXXXXX
gdb $(cat executable) coredump

可能有更好的方法来完成这个任务,但是gdb一直为我服务得很好,所以我没有寻找其他方法。只需将XXXXXXX替换为包含您的核心转储文件的文件夹即可。gdb命令可以直接复制粘贴使用。

参考资料:

Redhat书籍

CentOS论坛


谢谢这个信息。我已经得到了核心转储文件,但是如何使用 abrt 打开它呢? - Devos
如果您不确定核心文件是如何生成的,请执行 #file core.XYZ 命令,这将显示用于生成核心文件的命令。 - kumar
1
在Ubuntu 16.04及以上版本中,apport使用方式相同,并将转储保存到/var/crash/ - ivan_pozdeev

0

默认情况下,核心转储文件的名称为core或core.pid(如果文件/proc/sys/kernel/core_uses_pid包含值1),并在当前工作目录中创建。

但是,/proc/sys/kernel/core_pattern文件可用于设置定义模板的方式,以用于命名和设置核心转储文件的路径。此文件中的默认值为“core”。

我们可以将核心转储文件名设置为 $ sudo sysctl -w kernel.core_pattern="/tmp/%e_core.%p" 当我们的应用程序崩溃(比如说sleep),我们会期望在/tmp文件夹下出现一个带有名称模式为sleep_core.pid的文件。其中%e是程序名称,%p是程序的PID。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接