浅谈wince驱动调试方法(作者:wogoyixikexie@gliet)
以前,我调试驱动都是打包,下载,很郁闷,一个小小的DLL都要这么费神,对微软极为不满,现在发现驱动调试有一些诀窍,特来和大家分享,如果你有更好的方法,就来和大家分享吧。
之所以说“浅谈”,是因为我自己也搞得模模糊糊的,问过很多人,大家一致认为有三种调试方法:
一、使用应用程序动态加载驱动——优点是不用下载打包NK,可以在正常情况下看到驱动的运行情况;缺点是只能调试流驱动。在这方面有个专家做的很好,发布了驱动调试助手http://www.cnblogs.com/we-hjb/archive/2009/02/14/1250838.html#1451120——在这里就不多说了,看原版才是好的。
二、KITL。这个东西我用过,觉得调试那些不能启动的严重BUG很有用。下面适合一个朋友的谈话,很清晰了。
三、神秘武器......什么都不用!
加密助手 说:
--- 系统提示: 以下会话未被加密 ---
CSDN-Ricky_hu北京 说:
做过
CSDN-Ricky_hu北京 说:
这就是动态调试驱动,经常这样做
wogoyixikexie@gliet 说:
这个方法我很想学,你能不能教教我
wogoyixikexie@gliet 说:
整天烧写,太郁闷了
CSDN-Ricky_hu北京 说:
谈不上教, 很容易的
wogoyixikexie@gliet 说:
我都不知道怎么操作
CSDN-Ricky_hu北京 说:
你烧写一次,然后用pb通过kitl下载,在这个target->release dir module->add module里面添加你要调试的驱动就ok了
CSDN-Ricky_hu北京 说:
这个就是kitl的主要功能
wogoyixikexie@gliet 说:
这样加载上去也没有什么意思啊。因为KITL只能往前加载,不能往后加载的
CSDN-Ricky_hu北京 说:
你说的往后加载是什么意思?
wogoyixikexie@gliet 说:
就是比如我加载过一个驱动以后,不能再回来设置断点再次执行了
wogoyixikexie@gliet 说:
同一个驱动不能执行两次的吧
CSDN-Ricky_hu北京 说:
再回来设置断点就重新连接kitl啊
wogoyixikexie@gliet 说:
KITL,我的还有点问题,我只会使用一点点
CSDN-Ricky_hu北京 说:
在eboot里面配置好了就ok了
wogoyixikexie@gliet 说:
你的意思是说,在这个target->release dir module->add module里面添加你要调试的驱动,然后要重新连接KITL?
CSDN-Ricky_hu北京 说:
你要调试那个驱动就把它添加到target->release dir module->add module这里面,然后连接kitl调试,发现问题,修改后直接编译这个驱动,然后再重新连接kitl继续调试,再发现问题,再修改,再连kitl调试
wogoyixikexie@gliet 说:
哦,这也是个方法
wogoyixikexie@gliet 说:
这个方法很强大,可以调试本机驱动
wogoyixikexie@gliet 说:
使用应用程序只能调试流驱动
CSDN-Ricky_hu北京 说:
这是pb中kitl的基本调试方法,功能很强大,能打印很多调试信息
CSDN-Ricky_hu北京 说:
应用程序调试的只是接口,驱动内部的还是不能够调试
wogoyixikexie@gliet 说:
不过缺点是注册表修改之后就要重新下载内核才行
CSDN-Ricky_hu北京 说:
嗯,对,这个对于注册表以及kernel级别的修改要重新下载nk
wogoyixikexie@gliet 说:
还有一般要编译成debug版本的驱动才行,整个NK编译成debug版本会非常大。哈哈,原以为是不用KITL就可以加载的。厉害
CSDN-Ricky_hu北京 说:
不一定非得编译成debug版本的驱动啊,release版本的也可以通过kitl调试,而且调试信息也很丰富的
wogoyixikexie@gliet 说:
你用什么芯片?
wogoyixikexie@gliet 说:
PXA310?
CSDN-Ricky_hu北京 说:
你可以在release驱动里面加断点,一步步走,这样发现问题很快
CSDN-Ricky_hu北京 说:
pxa270,不过马上要用310了
wogoyixikexie@gliet 说:
有些驱动是有接口的,接口需要应用来访问
wogoyixikexie@gliet 说:
如果KITL+应用程序来调试,这样打印信息也会显示在PB里面吧
CSDN-Ricky_hu北京 说:
驱动一般都有接口,就看这个接口是留给谁来访问了
CSDN-Ricky_hu北京 说:
wogoyixikexie@gliet 说 (9:43):
如果KITL+应用程序来调试,这样打印信息也会显示在PB里面吧
对,会显示
wogoyixikexie@gliet 说:
不过这样已经很不错了。比如COM_Read这些,KITL应该不能在里面设置断点的吧
CSDN-Ricky_hu北京 说:
这个COM_Read是驱动提供的接口吗?如果是,也能设置断点的
wogoyixikexie@gliet 说:
是
wogoyixikexie@gliet 说:
要应用程序打开的
wogoyixikexie@gliet 说:
这个也行?
CSDN-Ricky_hu北京 说:
但是你要把断点设置在驱动里面,而不是应用程序里面
wogoyixikexie@gliet 说:
那太厉害了,那怎么控制它进去?
CSDN-Ricky_hu北京 说:
你用kitl就应该没问题
CSDN-Ricky_hu北京 说:
在XXX_Read
CSDN-Ricky_hu北京 说:
里面设置断点
wogoyixikexie@gliet 说:
是不是有命令才行进去,还是直接弄个断点就可以了?
CSDN-Ricky_hu北京 说:
你确定应用要调用xxx_read(),然后在它的驱动里面设置断点就可以断住了吧
wogoyixikexie@gliet 说:
这是很好的方法
CSDN-Ricky_hu北京 说:
具体的你可以试试,但是用kitl调试应用的话效果不太理想
CSDN-Ricky_hu北京 说:
你可以用vs调试应用,看问题出现在哪里,然后用pb继续跟踪驱动
wogoyixikexie@gliet 说:
我上次弄过一下子,发现液晶屏不会亮了,但是系统已经起来
CSDN-Ricky_hu北京 说:
呵呵
wogoyixikexie@gliet 说:
这个三星BSP做的不是很好。
CSDN-Ricky_hu北京 说:
我没用过三星的bsp和芯片
CSDN-Ricky_hu北京 说:
三星自己的手机啊什么的产品都不用他们自己的芯片和bsp,我们为什么要用呢,呵呵。。。
wogoyixikexie@gliet 说:
的确是
wogoyixikexie@gliet 说:
你是通过网卡来弄KITL的吧?
CSDN-Ricky_hu北京 说:
usb
CSDN-Ricky_hu北京 说:
其实也是模拟成网卡
wogoyixikexie@gliet 说:
很多人都不会用KITL,你那里有什么文档吗?有空写个完整的博客帮帮大家,哈哈
wogoyixikexie@gliet 说:
上次我也用USB,这样就会是同步软件不能连接了。不能弄应用程序进来联调
CSDN-Ricky_hu北京 说:
我也是从优龙的eboot里面移植过来的
CSDN-Ricky_hu北京 说:
还有pb下面mainstone的bsp里面也有,你也可以移植一下
wogoyixikexie@gliet 说:
哦,确实是,PB5.0下,那个正是PXA270的BSP。
CSDN-Ricky_hu北京 说:
有空我可以整理一下,但是目前很忙啊,产品马上要上市了,天天加班
CSDN-Ricky_hu北京 说:
是啊,我们就是在这个bsp上移植的,很好用,很快
wogoyixikexie@gliet 说:
我想弄个这种板子来搞搞。嘿嘿。
wogoyixikexie@gliet 说:
不打扰你了。谢谢你
CSDN-Ricky_hu北京 说:
客气,呵呵。。
准备结贴。
总结:
一、经过这次教训,MDD部分的代码最好不要修改,因为它极有可能和别的驱动公用,如果改动了,甚至让信息打印也会产生意想不到的后果,实在要修改的,就移植到BSP下,这样我们就可以任意妄为了。哈哈
二、意外收获——找到了最佳调试驱动方法。1、KITL(适合调试大BUG,比如异常,不能启动系统等情况) 2、驱动调试助手(适合调试流驱动,并且驱动中无注册表操作的情况,有注册表操作的会导致异常,如果有时间,可以修改一下这个BUG) 3、在platform.bib,platform.reg文件中准备好所调试驱动相关信息。再次调试修改该驱动的时候,只需要把该驱动的DLL代替wince windows目录下的老DLL即可。当然少不了应用程序配合调试其他功能(最好加入注册表操作)——这是我目前最支持的方法,因为最简单,最可靠!