使用systemd-coredump
调试应用程序崩溃
systemd-coredump
收集并显示内核核心转储,以分析应用程序崩溃。当某个进程崩溃(或所有属于某个应用程序的进程)时,其默认设置是将核心转储记录到日志中(systemd
如果可能的话包括回溯),并将核心转储存储在中的文件中 /var/lib/systemd/coredump
。您还可以选择使用其他工具(例如gdb
或crash
) 检查转储文件(请参见第17.8节“分析故障转储”)。可以选择不存储核心转储,而仅记录日志,这对于最大程度地减少敏感信息的收集和存储很有用。
使用和配置
systemd-coredump
并且默认情况下可以运行。默认配置在/etc/systemd/coredump.conf
:
[Coredump]
#Storage=external
#Compress=yes
#ProcessSizeMax=2G
#ExternalSizeMax=2G
#JournalSizeMax=767M
#MaxUse=
#KeepFree=
下面的示例显示了如何通过创建段错误来生成日志条目和核心转储,从而将Vim用于简单测试。
用VIM创建一个核心转储
-
启用debuginfo-pool
和 debuginfo-update
存储库
-
安装 vim-debuginfo
-
启动vim testfile
并输入几个字符
-
获取PID并生成段错误:
tux > ps ax | grep vim
2345 pts/3 S+ 0:00 vim testfile root # kill -s SIGSEGV 2345
Vim将发出错误消息:
Vim: Caught deadly signal SEGV
Vim: Finished.
Segmentation fault (core dumped)
-
列出您的核心转储,然后检查它们:
root # coredumpctl
TIME PID UID GID SIG PRESENT EXE
Wed 2019-11-12 11:56:47 PST 2345 1000 100 11 * /bin/vimroot # 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.scopeUnit: session-1.scopeSlice: user-1000.sliceSession: 1Owner UID: 1000 (tux)Boot ID: b5c251b86ab34674a2222cef102c0c88Machine ID: b43c44a64696799b985cafd95dc1b698Hostname: linux-uochCoredump: /var/lib/systemd/coredump/core.vim.0.b5c251b86ab34674a2222cef102Message: 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
全部显示。用PID
,COMM
(命令)或EXE
(可执行文件的完整路径)过滤它们, 例如,Vim的所有核心转储:
root # coredumpctl info /bin/vim
通过以下方式查看单个核心转储PID
:
root # coredumpctl info 2345
将选定的核心输出到gdb
:
root # 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
:
root # coredumpctl -o vim.dump dump 2345
有关完整的命令和选项列表,请参见man systemd-coredump
,man coredumpctl
和man coredump.conf
。
原文链接地址: https://documentation.suse.com/sles/15-SP1/html/SLES-all/cha-tuning-systemd-coredump.html