Linux内核栈调试

本文介绍了在Linux内核驱动调试中如何利用dump_stack和objdump进行栈信息分析,包括oops现象、寄存器信息、应用层信息和调用栈关系的解析,以及如何通过反汇编来精确定位异常代码。
摘要由CSDN通过智能技术生成

  Linux内核驱动调试经常遇到定位困难的问题,除了在代码之间添加log(printk/dev_info等)以外,还可以借助栈(stack)信息定位到代码。

dump_stack

现象

在这里插入图片描述

原因

  内核打印栈信息的常见原因有:

  • oops崩溃:常见问题有空指针、内存访问越界等
  • dump_stack函数:需要头文件linux/kprobes.h和asm/traps.h

分析

oops信息

<1>[   12.043486] Unable to handle kernel read from unreadable memory at virtual address 000003b8

  显示内存访问越界

寄存器信息

<4>[   12.043568] PC is at gpiochip_remove_pin_ranges+0x24/0xa0
<4>[   12.043572] LR is at gpiochip_remove+0xc8/0x1b8
<4>[   12.043596] pc : [<ffffff800864357c>] lr : [<ffffff8008646528>] pstate: 80400045

  PC:程序计数器,指向要执行的下一条指令,异常返回oops。
  LR:连接寄存器,子程序返回地址(有说法划分LR为过程连接寄存器PLR和异常连接寄存器ELR)

<4>[   12.043605] sp : ffffffc0f126bb60

  SP:栈指针寄存器,指向栈顶。

<4>[   12.043626] x29: ffffffc0f126bb60 x28: ffffff8009abc910 
<4>[   12.043645] x27: ffffff80098fa1a8 x26: ffffff80098820e8 
<4>[   12.043656] x25: ffffff800a3f0000 x24: 0000000000000002 
<4>[   12.043666] x23: ffffff800a43f2c8 x22: 00000000000003b8 
<4>[   12.043682] x21: ffffffc0e9734
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值