coredumpctl 是一个用于管理核心转储(core dumps)的实用工具,它随 systemd 一起提供。核心转储是一种当程序崩溃时保存其内存状态到文件的功能,这些文件对于调试和分析程序崩溃的原因非常有用。coredumpctl 工具允许用户查看、检索并分析由 systemd-coredump 所收集的核心转储。

1. 命令概述

名称:coredumpctl
作用:

  • 从 systemd-journald 日志中检索、查看、提取或调试 coredump(核心转储文件)。
  • 适用于基于 systemd 的系统,简化核心转储的管理。

核心功能:

  • 列出所有符合条件的 core 文件。
  • 提取指定 core 文件到本地。
  • 调试 core 文件(集成 gdb)。
  • 过滤 core 文件(基于 PID、进程名、可执行路径等)。
2. 基本语法
coredumpctl [OPTIONS...] {COMMAND} [PID|COMM|EXE|MATCH...]
3. 重要选项(Options)
选项作用示例
--no-legend不显示列标题。coredumpctl --no-legend list → 仅显示数据,无表头。
-1仅显示单个最新的 core 文件信息,而非所有匹配项。coredumpctl -1 info → 显示最近的 core 详情。
-F, --field=FIELD列出指定字段在匹配的 core 日志条目中可能的值。coredumpctl -F _PID → 显示所有 core 对应的 PID 值。
-o, --output=FILE将 core 文件输出到指定文件(默认输出到标准输出)。coredumpctl -o mycore.dump dump /usr/bin/myapp → 保存到 mycore.dump。
-h, --help显示帮助信息。coredumpctl --help → 输出命令用法。
--version显示版本信息。coredumpctl --version → 输出版本号。
--no-pager禁用分页输出(默认使用 less 分页)。coredumpctl --no-pager list → 直接输出全部内容。
4. 主要命令(Commands)
命令作用示例
list默认命令,列出所有匹配的 core 文件。coredumpctl list firefox → 显示所有 Firefox 的 core 文件。
info显示指定 core 文件的详细信息(如时间、PID、信号、环境变量等)。coredumpctl info 1234 → 显示 PID 1234 的 core 详情。
dump提取匹配的最新 core 文件到本地(默认输出到标准输出,可用 -o 指定路径)。coredumpctl dump -o mycore.dump → 保存最近的 core 到文件。
gdb直接用 gdb 调试最新匹配的 core 文件(自动关联可执行文件)。coredumpctl gdb → 启动 gdb 调试最近的 core。
5. 匹配规则(MATCH)

可通过以下方式筛选 core 文件:

  1. PID:进程 ID(整数)。
    coredumpctl list 1234  # 匹配 PID 1234 的 core
    
  2. COMM:进程名称(不带路径,匹配 COREDUMP_COMM)。
    coredumpctl info firefox  # 匹配名为 `firefox` 的进程的 core
    
  3. EXE:可执行文件路径(必须包含 /,匹配 COREDUMP_EXE)。
    coredumpctl dump /usr/bin/myapp  # 匹配 `/usr/bin/myapp` 的 core
    
  4. MATCH:自定义 journalctl 表达式(需包含 =)。
    coredumpctl list _PID=5678  # 匹配特定 PID 的 core
    coredumpctl list _UID=1000  # 匹配用户 UID 1000 的 core
    
6. 退出状态(Exit Status)
状态码含义
0成功执行,找到匹配的 core 文件。
非零失败,可能原因:未找到匹配的 core 文件、权限错误、参数错误等。
7. 示例
示例1:列出所有 core 文件
coredumpctl list

输出:

TIME                            PID   UID   GID SIG COREFILE  EXE
Wed 2024-01-01 10:00:00 UTC    1234  1000  1000  11 coredump  /usr/bin/myapp
示例2:用 gdb 调试最近的 core
coredumpctl gdb

输出:
自动启动 gdb 并加载最近的 core 文件和对应的可执行文件,如:

GNU gdb (GDB) 13.1
Reading symbols from /usr/bin/myapp...
Core was generated by `/usr/bin/myapp'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0  0x00005555555551b9 in main ()
示例3:提取特定进程的 core
coredumpctl -o myapp.core dump /usr/bin/myapp

解释:

  • 提取 /usr/bin/myapp 的最新 core 到 myapp.core。
示例4:查看 core 的详细信息
coredumpctl info 5678

输出:

PID: 5678 (myapp)
UID: 1000
GID: 1000
Signal: 11 (SIGSEGV)
Timestamp: Wed 2024-01-01 10:00:00 UTC
Core Dump: /var/lib/systemd/coredump/core.myapp.1000.5678.20240101100000.1234.lz4
Executable: /usr/bin/myapp
8. 实际应用场景
  1. 调试崩溃程序:
    coredumpctl gdb myapp  # 直接调试特定程序的 core
    
  2. 批量处理 core 文件:
    coredumpctl --no-legend -o /tmp/%s.dump dump  # 将所有 core 文件保存到 /tmp
    
  3. 监控系统核心转储:
    coredumpctl list | grep -i "segfault"  # 查找所有段错误的 core
    
  4. 分析历史问题:
    coredumpctl info --since "2 days ago"  # 查看两天内的 core 信息
    
9. 注意事项
  • 权限要求:
    通常需要 root 权限才能访问所有 core 文件,普通用户只能查看自己的 core。
    sudo coredumpctl list
    
  • 依赖 systemd-journald:
    Core 文件需由 systemd-coredump 服务捕获并存储到日志中(默认路径 /var/lib/systemd/coredump/)。
  • 字段解释:
    • COREDUMP_COMM:进程名称(不带路径)。
    • COREDUMP_EXE:可执行文件的完整路径。
    • COREDUMP_SIGNAL:导致崩溃的信号(如 SIGSEGV)。
10. 与 gdb 的结合

coredumpctl gdb 会自动关联可执行文件和 core 文件,无需手动指定路径:

gdb /usr/bin/myapp /var/lib/systemd/coredump/core.myapp.1000.5678.20240100100000.1234.lz4

而 coredumpctl 简化为:

coredumpctl gdb myapp
11. 常见问题

Q1:如何查看所有 core 文件的路径?
A:

coredumpctl --no-legend -F COREDUMP unit

Q2:core 文件被压缩了吗?
A:
默认使用 lz4 压缩,路径如 /var/lib/systemd/coredump/core.<name>.<uid>.<pid>.<timestamp>.<inode>.lz4。

Q3:如何禁用 core 文件的捕获?
A:
修改 /etc/systemd/coredump.conf 中的 Storage=none 并重启服务。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐