如何设置核心转储文件位置(和名称)?

use*_*112 19 linux core-dump

我在 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 以便所有用户的软限制为零。

如何设置要输出的核心文件的位置?我想指定位置并附加生成转储的时间,作为文件名的一部分?

tal*_*zin 31

要在 CentOS 6 中设置核心转储的位置,您可以编辑/etc/sysctl.conf. 例如,如果您想在/var/crash以下位置进行核心转储:

kernel.core_pattern = /var/crash/core-%e-%s-%u-%g-%p-%t
Run Code Online (Sandbox Code Playgroud)

其中变量是:

%e是文件名
%g是进程在下运行的 gid
%p是进程的 pid
%s是导致转储的信号
%t是转储发生的时间
%u是进程正在运行的 uid

你也必须添加 /etc/sysconfig/init

DAEMON_COREFILE_LIMIT='unlimited'
Run Code Online (Sandbox Code Playgroud)

现在应用新的更改:

$ sysctl -p
Run Code Online (Sandbox Code Playgroud)

但这种方式有一个警告。如果内核参数 kernel.core_pattern 在重新启动时始终重置并覆盖为以下配置,即使在 中手动指定了值 /etc/sysctl.conf

|/usr/libexec/abrt-hook-ccpp %s %c %p %u %g %t e
Run Code Online (Sandbox Code Playgroud)

简而言之,当abrtd.service启动时kernel.core_pattern被安装的系统自动覆盖abrt-addon-ccpp。有两种方法可以解决这个问题:

  1. 配置文件DumpLocation中的设置选项/etc/abrt/abrt.conf。目的目录可以通过/var/crash/etc/abrt/abrt.conf配置文件中设置DumpLocation=来指定,sysctl kernel.core_pattern显示的值是一样的,但实际上会创建core文件到/var/crash.

    此外,如果您启用了 SELinux,则必须运行:

    $ semanage fcontext -a -t public_content_rw_t "/var/crash(/.*)?"  
    $ setsebool -P abrt_anon_write 1
    
    Run Code Online (Sandbox Code Playgroud)

    最后重新启动abrtd.service

    $ service abrtd.service restart
    
    Run Code Online (Sandbox Code Playgroud)
  2. 停止 abrtd 服务。kernel.core_pattern不会被覆盖。- (我从未测试过)。