使用systemd-coredump调试应用程序崩溃

使用systemd-coredump调试应用程序崩溃

systemd-coredump收集并显示内核核心转储,以分析应用程序崩溃。当某个进程崩溃(或所有属于某个应用程序的进程)时,其默认设置是将核心转储记录到日志中(systemd如果可能的话包括回溯),并将核心转储存储在中的文件中 /var/lib/systemd/coredump。您还可以选择使用其他工具(例如gdbcrash) 检查转储文件(请参见第17.8节“分析故障转储”)。可以选择不存储核心转储,而仅记录日志,这对于最大程度地减少敏感信息的收集和存储很有用。

使用和配置

systemd-coredump并且默认情况下可以运行。默认配置在/etc/systemd/coredump.conf

[Coredump]
#Storage=external
#Compress=yes
#ProcessSizeMax=2G
#ExternalSizeMax=2G
#JournalSizeMax=767M
#MaxUse=
#KeepFree=

下面的示例显示了如何通过创建段错误来生成日志条目和核心转储,从而将Vim用于简单测试。

用VIM创建一个核心转储
  1. 启用debuginfo-pooldebuginfo-update存储库

  2. 安装 vim-debuginfo

  3. 启动vim testfile并输入几个字符

  4. 获取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)
    
  5. 列出您的核心转储,然后检查它们:

    root # coredumpctl
    TIME                        PID  UID  GID SIG PRESENT EXE
    Wed 2019-11-12 11:56:47 PST 2345 1000 100 11  *       /bin/vim
    
    root # 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.scope
        Unit: session-1.scope
        Slice: user-1000.slice
        Session: 1
        Owner UID: 1000 (tux)
        Boot ID: b5c251b86ab34674a2222cef102c0c88
        Machine ID: b43c44a64696799b985cafd95dc1b698
        Hostname: linux-uoch
        Coredump: /var/lib/systemd/coredump/core.vim.0.b5c251b86ab34674a2222cef102
        Message: 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 全部显示。用PIDCOMM(命令)或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-coredumpman coredumpctlman coredump.conf

原文链接地址: https://documentation.suse.com/sles/15-SP1/html/SLES-all/cha-tuning-systemd-coredump.html

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值