Linux系统之coredumpctl命令详解
·
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 文件:
- PID:进程 ID(整数)。
coredumpctl list 1234 # 匹配 PID 1234 的 core - COMM:进程名称(不带路径,匹配
COREDUMP_COMM)。coredumpctl info firefox # 匹配名为 `firefox` 的进程的 core - EXE:可执行文件路径(必须包含
/,匹配COREDUMP_EXE)。coredumpctl dump /usr/bin/myapp # 匹配 `/usr/bin/myapp` 的 core - 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. 实际应用场景
- 调试崩溃程序:
coredumpctl gdb myapp # 直接调试特定程序的 core - 批量处理 core 文件:
coredumpctl --no-legend -o /tmp/%s.dump dump # 将所有 core 文件保存到 /tmp - 监控系统核心转储:
coredumpctl list | grep -i "segfault" # 查找所有段错误的 core - 分析历史问题:
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 并重启服务。
更多推荐
所有评论(0)