WINCE 驱动异常分析

 
WINCE 驱动异常分析 写过驱动的应该都碰到过驱动程序出现异常的问题,引起异常的原因有很多,例如,栈溢出,指针错误等。但我们怎么样才能最快速的找到产生异常的地方与原因。

WINCE 为我们编译连接的每个.dll文件生成了一个同名的.MAP文件,我们只要通过这个MAP文件就可以快速的找到产生异常的代码,MAP文件可以从/WINCE500/PBWorkspaces/project/RelDir/Release目录中找到。 举个例子,异常如下:

CMMB: IOCTL_POWER_SET - Changing power state to D3 Data Abort: Thread=83a5d4a8 Proc=80426380 'device.exe' AKY=0000000d PC=01de4c94(cmmbspidrv.dll+0x00004c94) RA=01de4c94(cmmbspidrv.dll+0x00004c94) BVA=06000041 FSR=00000003

 

从上面我们可以看出,出现异常的是cmmbspidrv.dll驱动程序,异常地址为cmmbspidrv.dll的RVA地址+0x00004c94(BASE地址)。

 那我们再来看一下cmmbspidrv.map文件就可以清楚的知道异常产生在哪里了。

Preferred load address is 10000000 这个表示RVA基地址

Address Publics by Value Rva+Base Lib:Object

0001:000034d4 DllEntry 100044d4 f CmmbSPI.obj

0001:00003638 CPI_Init 10004638 f CmmbSPI.obj

0001:00003aa4 CPI_Deinit 10004aa4 f CmmbSPI.obj

0001:00003b04 CPI_Open 10004b04 f CmmbSPI.obj

0001:00003b0c CPI_Close 10004b0c f CmmbSPI.obj

0001:00003b14 CPI_Read 10004b14 f CmmbSPI.obj

0001:00003b40 CPI_Write 10004b40 f CmmbSPI.obj

0001:00003b48 CPI_IOControl 10004b48 f CmmbSPI.obj

0001:00003e64 CPI_Seek 10004e64 f CmmbSPI.obj

0001:00003e6c CPI_PowerDown 10004e6c f CmmbSPI.obj

0001:00003e70 CPI_PowerUp 10004e70 f CmmbSPI.obj

结合MAP文件,我们可以很快算出异常崩溃地址为:10004c94,查找MAP文件发现并没有这个地址,那我们就找比它少的地址。从上面我们可以看出异常是由 CPI_IOControl 里面产生的。再结合调试信息我们可以很准确的找到原因。

同理应用程序中的异常分析也可以采用以上的方法,用Visual Studio 2005 的可以在link->debug下设定输出MAP文件。

总结:驱动容易出现异常很多情况是指针错误,或者栈溢出。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/macrozhang001/archive/2010/04/27/5532058.aspx

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值