首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

内核调试的方法(4)

内核调试的方法(4)

启动应用程序
# ./leddrivertest2 0 3
APPpen fd=[3]
APP:led_no=[0] time=[3]
DEVICE:cmd=[0], arg=[3]  //会发现驱动程序卡死在这里了,无论怎么也退出不了,下面打印出来了很多关键信息。
asm_do_IRQ==>s3c2410_timer_interrupt : pid=[806], task_name=[leddrivertest2], PC=[0xbf000044]
asm_do_IRQ==>s3c2410_timer_interrupt : pid=[806], task_name=[leddrivertest2], PC=[0xbf000044]
PC=0xbf000044

3,定位僵死发生的代码的具体位置
3.1), PC=0xbf000044
从这些信息里找到一个相近的地址, 这个地址<=0xbf000044
前面有分析 可知 地址 0xbf000044 不属于内核地址空间,属于外加的内核。
在开发板目录下 :
# cat /proc/kallsyms >> kallsyms.txt
在这个文件下面,查找 地址 0xbf000044 大概在什么函数
bf000000 t $a [leddriver2]
bf000048 t $d [leddriver2]   // 对于中断, pc-4=0xbf000044 才是发生中断瞬间的地址,说明发生中断的驱动程序是 : leddriver2.ko。

bf002000 t leddriver2_init [leddriver2]
bf00004c t leddriver2_exit [leddriver2]
c481e178 ? __mod_license202 [leddriver2]
c481e184 ? __mod_description201 [leddriver2]
c481e1a4 ? __mod_author200 [leddriver2]
bf0008a0 b $d [leddriver2]
bf0008a4 b MYDRIVER_Major [leddriver2]
bf000698 d leddriver2_fops [leddriver2]
bf000698 d $d [leddriver2]
bf000028 t leddriver2_ioctl [leddriver2] //bf000028 是与 0xbf000044 最近的地址。说明 : 发生中断的驱动程序是 : leddriver2.ko。
bf000000 t leddriver2_open [leddriver2] //中断很有可能发生在 leddriver2_ioctl 函数中。
bf000014 t leddriver2_release [leddriver2]
bf000704 d GPBDAT_HIGH [leddriver2]
bf000714 d GPBDAT_LOW [leddriver2]
bf000724 d GPBUP_UPEN [leddriver2]
bf000734 d GPBCON_OUTP [leddriver2]
bf000744 d GPBCON_CLEAN [leddriver2]
bf000000 t $a [leddriver2]
bf000048 t $d [leddriver2]
bf002000 t $a [leddriver2]
bf002094 t $d [leddriver2]
bf00004c t $a [leddriver2]
bf000080 t $d [leddriver2]

3.2), 找到 leddriver2.ko
在PC上反汇编它:
在ubuntu目录下 :
# arm-linux-objdump -D leddriver2.ko > leddriver2.dis //PATH没有,就用下面一行
# /home/wangxc/linux/toolchain/crosstools_3.4.1_softfloat/arm-linux/gcc-3.4.1-glibc-2.3.3/bin/arm-linux-objdump -D leddriver2.ko > leddriver2.dis

在dis文件里找到 leddriver2_ioctl

00000028 :  //insmod后 上面的地址 bf000028 对应在这里
  28: e1a0c00d mov ip, sp
  2c: e92dd800 stmdb sp!, {fp, ip, lr, pc}
  30: e24cb004 sub fp, ip, #4 ; 0x4
  34: e59f000c ldr r0, [pc, #12] ; 48 <.text+0x48>
  38: e1a01002 mov r1, r2
  3c: e1a02003 mov r2, r3
  40: ebfffffe bl 40 // 对于中断, pc-4才是发生中断瞬间的地址,所以僵死的代码在这里
  44: ea00000f b 88 //所以 0xbf000044 在这里
  48: 00000000 andeq r0, r0, r0
Disassembly of section .init.text:

3.3), 分析汇编代码,找到对应的c语言代码
40: ebfffffe bl 40  //bl自己跳转到自己,就是一个死循环,
所以,c语言代码中的就是死循环的语句。
在驱动源码leddriver2_ioctl函数中寻找,可以找到 while(1);语句,说明僵死就发生在这里。
继承事业,薪火相传
返回列表