本文译者是一位开源理念的坚定支持者,所以本文虽然不是软件,但是遵照开源的精神发布。
本文译者十分愿意与他人分享劳动成果,如果你对我的其他翻译作品或者技术文章有兴趣,可以在如下位置查看现有的作品集:
由于译者水平有限,因此不能保证译文内容准确无误。如果你发现了译文中的错误(哪怕是错别字也好),请来信指出,任何提高译文质量的建议我都将虚心接纳。
coredumpctl — 提取与处理已保存的内存转储数据
coredumpctl
[OPTIONS...] {COMMAND} [PID|COMM|EXE|MATCH...]
可以识别的选项如下:
-h
, --help
¶--version
¶--no-legend
¶不输出列标题,也就是不在输出列表的头部和尾部显示字段的名称。
--no-pager
¶不将程序的输出内容管道(pipe)给分页程序。
-1
¶仅显示单独一个内存转储的信息, 而不是列出全部已知的内存转储。
-S
, --since
¶仅显示指定时刻之后发生的内存转储。
-U
, --until
¶仅显示指定时刻之前发生的内存转储。
-r
, --reverse
¶翻转输出顺序,也就是首先显示最近发生的内存转储。
-F
FIELD
, --field=
FIELD
¶显示在日志中匹配到的全部内存转储的指定字段的所有可能值。
[译者注]类似于SQL语句:
"SELECT DISTINCT 指定字段 FROM 在日志中匹配到的全部内存转储
"
-o
FILE
, --output=
FILE
¶将内存镜像保存到指定的 FILE
文件中。
--debugger=
DEBUGGER
¶为 debug 命令指定调试器。
如果没有指定此选项,并且也没有设置 $SYSTEMD_DEBUGGER
环境变量,那么将会使用默认的
gdb(1)
调试器。
-D
DIR
, --directory=
DIR
¶仅使用指定的 DIR
目录中的日志。
-q
, --quiet
¶安静模式, 也就是不显示任何例如无权访问日志文件、内存转储正在保存中之类的警告信息与提示信息。
可以识别的命令如下:
列出日志中所有符合指定特征的内存转储。 如果没有明确使用任何命令, 那么该命令就是隐含的默认命令。
此命令会输出一个便于人类阅读的列表, 列表中将包含以下字段:
内核报告的发生崩溃的时刻
崩溃进程的进程标识符
崩溃进程的身份标识符(属主与属组)
导致进程崩溃的信号(若可用)
内核转储是否已经被保存、以及是否仍然可以访问:
"none
" 表示未被保存;
"-
"
表示不可用(例如因为进程不是被某个信号结束);
"present
" 表示已被保存在外部文件中并且可以被当前用户访问;
"journal
" 表示已被保存在日志中并且可以被当前用户访问;
"truncated
"
表示因为内存转储的体积太大,已被截断保存,并且可以被当前用户访问;
"error
"
表示无法访问先前已保存的内存转储(通常是因为没有权限);
"missing
" 表示
先前保存的外部文件已经被删除;
可执行文件的完整路径。 对于脚本来说则是解释器的完整路径。
需要特别提醒的是,
保存在日志中的元数据与保存在外部文件中的内存镜像(位于
/var/lib/systemd/coredump/
目录中)所受到的限制是完全不同的(详见
systemd-coredump(8) 手册)。
所以,经常会出现这样的情况:
在日志中仍然存在的内存转储事件所对应的保存内存镜像的外部文件
已经被删除。
显示从日志中提取的、与指定的特征匹配的那些内存转储的详细信息。 若未指定匹配特征, 则显示最近一次内存转储的详细信息。
提取与指定的特征匹配的最近一次内存转储数据(内存镜像)。
若未指定匹配特征,则匹配最近一次内存转储。
因为二进制数据不适合直接显示,所以务必将此命令的输出重定向到一个文件中,或者配合
--output=
选项一起使用。
调用调试器来分析与指定的特征匹配的最近一次内存转储。
若未指定匹配特征,则匹配最近一次内存转储。默认使用
gdb(1)
调试器,但是也可以使用 --debugger=
选项或者 $SYSTEMD_DEBUGGER
环境变量
来指定其他调试器。
可以识别的特征如下:
PID
¶一个正整数, 表示 发生内核转储的进程的"PID"。
COMM
¶可执行程序的文件名(用于匹配
COREDUMP_COMM=
字段),必须不能包含路径分隔符(斜杠)。
EXE
¶可执行程序的路径(用于匹配
COREDUMP_EXE=
字段),
必须包含至少一个路径分隔符(正斜杠)。
MATCH
¶常规的日志过滤器(必须符合"FIELD=VALUE
"格式)。
详见
journalctl(1) 手册。
例 4. 提取 /usr/bin/bar 的最近一次内存转储数据(内存镜像),并将其保存在
bar.coredump
文件中:
# coredumpctl -o bar.coredump dump /usr/bin/bar