linux crash,系统崩溃 - crash工具介绍

工欲善其事,必先利其器。本文主要介绍linux下crash工具常用命令的功能和使用。

背景知识

crash是redhat的工程师开发的,主要用来离线分析linux内核转存文件,它整合了gdb工具,功能非常强大。可以查看堆栈,dmesg日志,内核数据结构,反汇编等等。crash支持多种工具生成的转存文件格式,如kdump,LKCD,netdump和diskdump,而且还可以分析虚拟机Xen和Kvm上生成的内核转存文件。同时crash还可以调试运行时系统,直接运行crash即可,ubuntu下内核映象存放在/proc/kcore。

ad03152a0a53

运行时系统调试

crash和linux内核是紧密耦合的,会随着内核的变化持续更新,它向前兼容的,新的crash工具可以分析老内核的转存文件。如果你的内核版本较新,crash无法解析,可以尝试安装最新的crash工具。

常用命令

下面介绍常用命令的使用,主要参考了crash_whitepaper和crash工具自带的帮助文档。crash_whitepaper介绍了开发的初衷,编译,命令的分类和使用以及如何添加自己的命令,是一个非常好的参考文献。我用的版本是crash-7.2.6和gdb-7.6,使用时可以使用“help command”来查看详细的帮助文档,详细的命令列表见附件。

ad03152a0a53

帮助文档

crash在加载内核转存文件是会输出系统基本信息,如出问题的进程(bash - 2613),系统内存大小(7.9GB),系统架构(x86_64)等等,可以看到这个dump是sysrq触发的一个panic系统崩溃。

KERNEL: ../kernel-src/linux-4.19.53/vmlinux

DUMPFILE: crash/201907070732/dump.201907070732 [PARTIAL DUMP]

CPUS: 4

DATE: Sun Jul 7 07:31:34 2019

UPTIME: 00:10:27

LOAD AVERAGE: 0.14, 0.16, 0.12

TASKS: 584

NODENAME: glbian-OptiPlex-990

RELEASE: 4.19.53

VERSION: #1 SMP Sun Jun 23 11:01:25 CST 2019

MACHINE: x86_64 (3292 Mhz)

MEMORY: 7.9 GB

PANIC: "sysrq: SysRq : Trigger a crash"

PID: 2613

COMMAND: "bash"

TASK: ffff8b7df3cdae00 [THREAD_INFO: ffff8b7df3cdae00]

CPU: 2

STATE: TASK_RUNNING (SYSRQ)

查看堆栈

一般可以先查看堆栈(bt),看看系统死在什么地方,进而确定调查方向。可以看到这个dump的异常发生在sysrq的处理函数里面。

crash> bt

PID: 2613 TASK: ffff8b7df3cdae00 CPU: 2 COMMAND: "bash"

'#0 [ffffa0f442cd7a08] machine_kexec at ffffffff99a69313

'#1 [ffffa0f442cd7a68] __crash_kexec at ffffffff99b3e6b9

'#2 [ffffa0f442cd7b30] crash_kexec at ffffffff99b3f441

'#3 [ffffa0f442cd7b50] oops_end at ffffffff99a32bed

'#4 [ffffa0f442cd7b78] no_context at ffffffff99a7997c

'#5 [ffffa0f442cd7bd8] __bad_area_nosemaphore at ffffffff99a79d15

'#6 [ffffa0f442cd7c20] bad_area at ffffffff99a79f86

'#7 [ffffa0f442cd7c48] __do_page_fault at ffffffff99a7a486

'#8 [ffffa0f442cd7cc0] do_page_fault at ffffffff99a7a60d

'#9 [ffffa0f442cd7cf0] page_fault at ffffffff9a6010ae

[exception RIP: sysrq_handle_crash+22]

RIP: ffffffff9a034066 RSP: ffffa0f442cd7da8 RFLAGS: 00010286

RAX: ffffffff9a034050 RBX: 0000000000000063 RCX: 0000000000000006

RDX: 0000000000000000 RSI: 0000000000000096 RDI: 0000000000000063

RBP: ffffa0f442cd7da8 R8: 00000000000002f2 R9: 0000000000000007

R10: 0000000000000000 R11: ffffffff9b39c3ed R12: 0000000000000004

R13: 0000000000000000 R14: ffffffff9afa7300 R15: ffff8b7de5af9100

ORIG_RAX: ffffffffffffffff CS: 0010 SS: 0018

'#10 [ffffa0f442cd7db0] __handle_sysrq at ffffffff9a0347e8

'#11 [ffffa0f442cd7de0] write_sysrq_trigger at ffffffff9a034cbf

... ...

另外可以加参数显示函数偏移,函数所在的文件和每一帧的具体内容,从而对照源码和汇编代码,查看函数入参和局部变量。

crash> bt -slf

PID: 2613 TASK: ffff8b7df3cdae00 CPU: 2 COMMAND: "bash"

'#0 [ffffa0f442cd7a08] machine_kexec+451 at ffffffff99a69313

/home/glbian/data/kernel-src/linux-4.19.53/arch/x86/kernel/machine_kexec_64.c: 346

ffffa0f442cd7a10: 0000a0f442cd7a50 ffff8b7c40000000

ffffa0f442cd7a20: 0000000024001000 ffff8b7c64001000

ffffa0f442cd7a30: 0000000024000000 a05cedc0dfb99200

ffffa0f442cd7a40: a05cedc0dfb99200 ffffa0f442cd7cf8

ffffa0f442cd7a50: 0000000000000009 ffffa0f442cd7cf8

ffffa0f442cd7a60: ffffa0f442cd7b28 ffffffff99b3e6b9

... ...

’#8 [ffffa0f442cd7cc0] do_page_fault+45 at ffffffff99a7a60d

/home/glbian/data/kernel-src/linux-4.19.53/arch/x86/mm/fault.c: 1470

ffffa0f442cd7cc8: ffff8b7e6500d140 0000000000000000

ffffa0f442cd7cd8: 0000000000000000 0000000000000000

ffffa0f442cd7ce8: ffffa0f442cd7cf9 ffffffff9a6010ae

'#9 [ffffa0f442cd7cf0] page_fault+30 at ffffffff9a6010ae

/home/glbian/data/kernel-src/linux-4.19.53/arch/x86/entry/entry_64.S: 1181

[exception RIP: sysrq_handle_crash+22]

RIP: ffffffff9a034066 RSP: ffffa0f442cd7da8 RFLAGS: 00010286

RAX: ffffffff9a034050 RBX: 0000000000000063 RCX: 0000000000000006

RDX: 0000000000000000 RSI: 0000000000000096 RDI: 0000000000000063

RBP: ffffa0f442cd7da8 R8: 00000000000002f2 R9: 0000000000000007

R10: 0000000000000000 R11: ffffffff9b39c3ed R12: 0000000000000004

R13: 0000000000000000 R14: ffffffff9afa7300 R15: ffff8b7de5af9100

ORIG_RAX: ffffffffffffffff CS: 0010 SS: 0018

/home/glbian/data/kernel-src/linux-4.19.53/drivers/tty/sysrq.c: 147

ffffa0f442cd7cf8: ffff8b7de5af9100 ffffffff9afa7300

ffffa0f442cd7d08: 0000000000000000 0000000000000004

ffffa0f442cd7d18: ffffa0f442cd7da8 0000000000000063

ffffa0f442cd7d28: ffffffff9b39c3ed 0000000000000000

ffffa0f442cd7d38: 0000000000000007 00000000000002f2

ffffa0f442cd7d48: ffffffff9a034050 0000000000000006

ffffa0f442cd7d58: 0000000000000000 0000000000000096

ffffa0f442cd7d68: 0000000000000063 ffffffffffffffff

ffffa0f442cd7d78: ffffffff9a034066 0000000000000010

ffffa0f442cd7d88: 0000000000010286 ffffa0f442cd7da8

ffffa0f442cd7d98: 0000000000000018 0000000000000000

ffffa0f442cd7da8: ffffa0f442cd7dd8 ffffffff9a0347e8

'#10 [ffffa0f442cd7db0] __handle_sysrq+136 at ffffffff9a0347e8

/home/glbian/data/kernel-src/linux-4.19.53/drivers/tty/sysrq.c: 583

ffffa0f442cd7db8: 0000000000000002 fffffffffffffffb

ffffa0f442cd7dc8: ffffa0f442cd7ee8 0000563d45717780

ffffa0f442cd7dd8: ffffa0f442cd7df0 ffffffff9a034cbf

... ...

可以用dis命令进行返汇编,查看对应地址的代码逻辑。

>crash> dis -r ffffffff9a6010ae

0xffffffff9a601090 : data32 xchg %ax,%ax

0xffffffff9a601093 : callq 0xffffffff9a601230

0xffffffff9a601098 : mov %rsp,%rdi

0xffffffff9a60109b : mov 0x78(%rsp),%rsi

0xffffffff9a6010a0 : movq

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值