Linux内核调试4

本文详细介绍了Linux内核调试中的printk方法,用于打印内核信息,并讲解了如何通过段错误分析进行驱动调试。具体步骤包括:1) 使用printk和dmesg分析内核打印;2) 分析段错误信息,通过System.map和kallsyms确定错误源;3) 利用栈信息确定函数调用过程;4) 提到自制工具如寄存器编辑器和修改系统时钟中断辅助定位问题。
摘要由CSDN通过智能技术生成
调试嵌入式 Linux内核的方法如下。
 1 目标机“插桩”,如打上KGDB补丁,这样主机上的GDB可与目标机的KGDB
通过串口或网口通信。
2  使用仿真器,仿真器可直接连接目标机的JTAG/BDM,这样主机的GDB 就
可以通过与仿真器的通信来控制目标机。
3 在目标板上通过printk()、oops、strace 等软件方法进行“观察”调试,这些

方法不具备查看和修改数据结构、断点、单步等功能。


1、内核打印信息—printk()


 printk()这种最原始的方法却更广泛地被应用


 通过如下命令可以使得Linux 内核的任何printk都被输出

 echo 8 > /proc/sys/kernel/printk


驱动调试之打印到proc虚拟文件

      

  dmesg 打印缓冲区的信息

 用户也可以直接使用“cat /proc/kmsg”命令来显示内核信息


2、驱动调试之段错误分析_根据oops信息

定出错的代码位置

二. 根据内核打印的段错误信息分析
a. 作为模块:
(根据pc=0xbf000018 找到“事发现场”)
1. 根据pc值确定该指令属于内核还是外加的模块
pc=0xbf000018 它属于什么的地址?是内核还是通过insmod加载的驱动程序?
先判断是否属于内核的地址: 看System.map(vi System.map)确定内核的函数的地址范围:c0004000~c03265a4
CONFIG_FRMAE_POINTER  针指针,可以打印回溯信息

如果不属于System.map里的范围,则它属于insmod加载的驱动程序


2. 假设它是加载的驱动程序引入的错误,怎么确定是哪一个驱动程序?
先看看加载的驱动程序的函数的地址范围
cat /proc/kallsyms  (内核函数、加载的函数的地址)
cat /proc/kallsyms >/kallsyms.txt
从这些信息里找到一个相近的地址, 这个地址<=0xbf000018
比如找到了:
bf000000 t first_drv_open [first_drv]


3. 找到了first_drv.ko
在PC上反汇编它: arm-linux-objdump -D first_drv.ko > frist_drv.dis
在dis文件里找到first_drv_open


    first_drv.dis文件里              insmod后
00000000 <first_drv_open>:       bf000000 t first_drv_open [first_drv]
00000018                         pc = bf000018

./firstdrvtest on
Unable to handle kernel paging requ

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值