coredumpctl 是一个用于管理、检索和分析系统核心转储文件(core dumps)的命令行工具。它随 systemd 一起提供,是 Linux 系统上调试程序崩溃问题的得力助手-。
概述
当一个程序异常崩溃时,操作系统会将其内存状态保存为一个核心转储文件,这对于事后分析崩溃原因至关重要-。coredumpctl 的核心作用就是统一管理由 systemd-coredump 服务收集的这些转储文件,让你可以方便地列出、查看、提取,甚至直接启动调试器进行分析。
基本语法
coredumpctl 的基本命令格式如下:
bash
coredumpctl [选项...] {命令} [PID|进程名|可执行文件路径|匹配条件...]
选项 (Options)
以下是一些常用的选项,用于控制命令的输出和行为:
| 选项 | 说明 |
|---|---|
-h, --help |
显示帮助信息。 |
--version |
显示版本信息。 |
--no-pager |
禁止将输出通过分页器(如 less)显示,直接输出全部内容。 |
--no-legend |
不打印列标题(表头)。 |
-1 |
只显示最新一个匹配的核心转储文件的信息。 |
-F, --field=FIELD |
列出匹配的 core 日志条目中,指定字段(如 _PID)的所有可能取值。 |
-o, --output=FILE |
将提取的 core 文件保存到指定文件,而不是输出到标准输出。 |
--debugger=DEBUGGER |
指定要使用的调试器(默认为 gdb)。 |
命令 (Commands)
这是 coredumpctl 的核心功能,通过不同的子命令来完成不同的任务。
| 命令 | 作用 | 示例 |
|---|---|---|
list |
列出所有匹配的核心转储文件。这是默认命令,如果不指定其他命令,将执行此操作。 | coredumpctl list |
info |
显示匹配的核心转储文件的详细信息,如崩溃时间、PID、信号、环境变量等。 | coredumpctl info 1234 |
dump |
提取 匹配的最新 core 文件。默认输出到标准输出,通常与 -o 选项配合使用。 |
coredumpctl -o mycore.dump dump |
debug (或 gdb) |
使用调试器(默认为 GDB)调试匹配的最新 core 文件。 | coredumpctl gdb |
匹配规则 (Matching)
你可以通过以下方式精确筛选你想要操作的核心转储文件:
-
PID:按进程 ID 匹配,使用整数。
- 例如:
coredumpctl info 1234
- 例如:
-
COMM:按进程名称匹配(不带路径)。
- 例如:
coredumpctl list firefox
- 例如:
-
EXE :按可执行文件的完整路径匹配(必须包含至少一个
/)。- 例如:
coredumpctl dump /usr/bin/myapp
- 例如:
-
MATCH :使用
journalctl风格的通用匹配表达式(必须包含=)。- 例如:
coredumpctl list COREDUMP_COMM=myapp
- 例如:
使用示例
查看所有核心转储
bash
coredumpctl list
这会显示一个包含时间、PID、UID、信号、核心文件状态和可执行文件路径的表格。
列出特定程序的所有 core 文件
bash
coredumpctl list /usr/bin/firefox
查看特定 PID 的详细信息
bash
coredumpctl info 6654
将最新 core 文件保存到本地
bash
coredumpctl -o /path/to/myapp.core dump /usr/bin/myapp
使用 GDB 调试最新崩溃
bash
coredumpctl gdb
此命令会自动加载对应的可执行文件和 core 文件,让你直接开始调试
coredumpctl gdb(或 debug)命令支持通过进程名、可执行文件路径或 PID 来精确选择并调试特定程序产生的 core 文件-。
以下是几种常用的指定方式:
| 匹配方式 | 语法 | 说明 | 示例 |
|---|---|---|---|
| 进程名 (COMM) | coredumpctl gdb <进程名> |
匹配进程的名称,不能包含斜杠 /。 |
coredumpctl gdb firefox 会调试 firefox 程序最后一次产生的 core 文件-。 |
| 可执行文件路径 (EXE) | coredumpctl gdb <可执行文件路径> |
匹配可执行文件的完整路径 ,必须包含至少一个斜杠 /。 |
coredumpctl gdb /usr/bin/myapp 会调试 /usr/bin/myapp 程序最后一次产生的 core 文件。 |
| 进程ID (PID) | coredumpctl gdb <PID> |
匹配特定的进程 ID。 | coredumpctl gdb 6654 会调试 PID 为 6654 的进程产生的 core 文件-。 |
💡 补充说明
-
gdb与debug命令等价 :coredumpctl gdb和coredumpctl debug在功能上是相同的,都可以用来启动调试器。 -
指定调试器 :默认使用 GDB,你也可以通过
--debugger=选项或$SYSTEMD_DEBUGGER环境变量来指定其他调试器-。 -
处理多个匹配 :如果匹配到多个 core 文件,
coredumpctl默认会操作最新的一个。 -
注意事项 :要获得完整的调试信息(如变量名、函数名),请确保你的程序在编译时包含了调试符号(通常使用
-g选项)。
注意事项
-
存储位置 :核心转储文件默认保存在
/var/lib/systemd/coredump/目录下。其元数据(metadata)则存储在 systemd 日志(journal)中-。 -
数据一致性:日志中的元数据和实际 core 文件可能不同步。例如,日志中可能还记录着一个已被手动删除的 core 文件信息。
-
退出状态 :命令成功执行返回
0,如果未找到任何匹配的核心转储,则被视为失败并返回非零值。
总的来说,coredumpctl 将传统的 core dump 文件管理从分散、手动的方式,转变为一个集中、自动化的流程,极大地简化了在 systemd 系统上的程序调试工作-。