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