跳到内容跳到页面导航:上一页 [access key p]/下一页 [access key n]
documentation.suse.com / SUSE Linux Enterprise Server 文档 / 系统分析和微调指南 / 处理系统转储 / 使用 systemd-coredump 针对应用程序崩溃进行调试
适用范围 SUSE Linux Enterprise Server 15 SP5

19 使用 systemd-coredump 针对应用程序崩溃进行调试

systemd-coredump 可收集并显示核心转储,用于分析应用程序崩溃问题。核心转储包含进程内存在终止时的映像。当某个进程(或属于应用程序的所有进程)崩溃时,此工具默认会将核心转储记录到 systemd 日志(如有可能还包括回溯),并将核心转储存储在 /var/lib/systemd/coredump 中的某个文件内。您还可以选择使用 gdbcrash 等其他工具检查转储文件(请参见第 18.8 节 “分析崩溃转储”)。

存储在 /var/lib/systemd/coredump 中的核心转储在三天后将被删除(请参见 /usr/lib/tmpfiles.d/systemd.conf 中的 d /var/lib/systemd/coredump 行)。

有一个选项不会存储核心转储,而是仅将其记录到日志,这样做有助于尽量减少敏感信息的收集与存储。

19.1 用法和配置

systemd-coredump 默认已启用,随时可供运行。默认配置位于 /etc/systemd/coredump.conf 中:

[Coredump]
#Storage=external
#Compress=yes
#ProcessSizeMax=2G
#ExternalSizeMax=2G
#JournalSizeMax=767M
#MaxUse=
#KeepFree=

大小单位为 B、K、M、G、T、P 和 E。ExternalSizeMax 还支持 infinity 值。

以下示例显示如何使用 Vim 进行简单的测试,方法是创建一个 segfault 来生成日志项和核心转储。

过程 19.1︰ 使用 Vim 创建核心转储
  1. 启用 debuginfo-pooldebuginfo-update 储存库

  2. 安装 vim-debuginfo

  3. 启动 vim testfile 并键入几个字符

  4. 获取 PID 并生成 segfault:

    > ps ax | grep vim
    2345 pts/3    S+     0:00 vim testfile
    
    # kill -s SIGSEGV 2345

    Vim 将发出错误消息:

    Vim: Caught deadly signal SEGV
    Vim: Finished.
    Segmentation fault (core dumped)
  5. 列出您的核心转储,然后对其进行检查:

    # coredumpctl
    TIME                        PID  UID  GID SIG PRESENT EXE
    Wed 2019-11-12 11:56:47 PST 2345 1000 100 11  *       /bin/vim
    
    # coredumpctl info
    PID: 2345 (vim)
    UID: 0 (root)
    GID: 0 (root)
    Signal: 11 (SEGV)
    Timestamp: Wed 2019-11-12 11:58:05 PST
    Command Line: vim testfile
    Executable: /bin/vim
    Control Group: /user.slice/user-1000.slice/session-1.scope
        Unit: session-1.scope
        Slice: user-1000.slice
        Session: 1
        Owner UID: 1000 (tux)
        Boot ID: b5c251b86ab34674a2222cef102c0c88
        Machine ID: b43c44a64696799b985cafd95dc1b698
        Hostname: linux-uoch
        Coredump: /var/lib/systemd/coredump/core.vim.0.b5c251b86ab34674a2222cef102
        Message: Process 2345 (vim) of user 0 dumped core.
    
             Stack trace of thread 2345:
             #0  0x00007f21dd87e2a7 kill (libc.so.6)
             #1  0x000000000050cb35 may_core_dump (vim)
             #2  0x00007f21ddbfec70 __restore_rt (libpthread.so.0)
             #3  0x00007f21dd92ea33 __select (libc.so.6)
             #4  0x000000000050b4e3 RealWaitForChar (vim)
             #5  0x000000000050b86b mch_inchar (vim)
    [...]

如果您有多个核心转储,coredumpctl info 会显示所有这些核心转储。可按 PIDCOMM(命令)或 EXE(可执行文件的完整路径)过滤核心转储,例如,查看 Vim 的所有核心转储:

# coredumpctl info /bin/vim

PID 查看单个核心转储:

# coredumpctl info 2345

将选定的核心输出到 gdb

# coredumpctl gdb 2345

PRESENT 列中的星号表示存在已存储的核心转储。如果该字段为空,则表示没有已存储的核心转储,coredumpctl 将从日志中检索崩溃信息。可以在 /etc/systemd/coredump.conf 中使用 Storage 选项控制此行为:

  • Storage=none — 在日志中记录核心转储,但不存储。这样做有助于尽量减少敏感信息的收集与存储,例如,出于符合一般数据保护条例 (GDPR) 的目的。

  • Storage=external — 将核心存储在 /var/lib/systemd/coredump

  • Storage=journal — 将核心存储在 systemd 日志中

将为每个核心转储调用 systemd-coredump 的新实例,因此,下一次核心转储时会应用配置更改,而无需重启动任何服务。

重启动系统后核心转储不会保留。可以使用 coredumpctl 永久保存核心转储。以下示例按 PID 过滤核心转储,并将核心存储在 vim.dump 中:

# coredumpctl -o vim.dump dump 2345

有关完整的命令和选项列表,请参见 man systemd-coredumpman coredumpctlman coreman coredump.conf