`
yangshen998
  • 浏览: 1240581 次
文章分类
社区版块
存档分类
最新评论

WinCE实验教程之五高级调试

 
阅读更多

作者:文斌
来源:文斌程序网 http://www.wenbinweb.com

回顾一下我们以前学过的内容,我们学习了嵌入式系统的基本概念,学习了如何定制一个操作系统,还学习了如何引导一个CE操作系统。这次我们来学习CE系统的高级调试技术,主要是利用PB的集成开发环境来调试操作系统的内核和设备驱动程序。

PB集成开发环境强大的调试功能为我们提供了可以深入调试系统程序的途径,它的操作方式与常规的集成开发环境如VC++等非常相似,但功能却比它们强得多,因为利用PB我们可以调试到一些系统内核部分的程序如内核组件、IE组件,也可以调试各种设备驱动程序如串口驱动、网卡驱动等,因此,我们才能够更加方便的定制专用的系统。

下面我们先来打开上次我们用的Hello的那个系统,我们定制它时是在模拟器上来模拟的,为了讲解方便,也为了更多的人能够方便的学习,我们以后的内容尽量使用模拟器。但是我们必须清楚的意识到,模拟器必竟不是真实的目标机器,哪怕你用一台PC机来作为CE的目标机器都比使用模拟器好,因此有条件的学习者还是使用真实的目标设备为好。

我们使用Debug的配置来重新编译Hello平台,假设目前我们要调试串口设备的驱动程序,那么我们先要找到串口驱动程序的源程序,这个可以通过Workspace窗口来找到,在设备驱动程序下的串口设备中找到并双击com16550.c源程序,就可以在主窗口中打开这个源程序了,在程序中设置断点以后当程序执行到断点处后就会中断,然后由我们通过在PB中使用调试工具栏上的单步跟踪等调试方法来进行驱动程序的调试,在调试工具栏中还可以查看到内存、调用堆栈、反汇编、变量、寄存器等调试工具。由于此处虽然使用核心调试功能,但程序的调试与常规的程序调试方法是相同的,所以此处不做更多的举例。

我们来看一下对CE目标设备的进程、线程等的控制。

将编译好的平台下载到目标设备上,我们打开Target菜单,使用“CE Processed”命令打开一个CE的进程管理窗口如下图:

在这个窗口中我们可以看到每一个CE进程的信息,同时在工具栏上还可以控制中止某一个进程或打开某一个进程的线程。

同样的,我们使用“CE Threads”命令可以打开线程窗口如下图:

在这个窗口中我们可以通过工具栏上的进程列表框来选择查看某个进程的所有线程的详细信息,包括调用堆栈及各种时间信息等。

如果想了解目标平台中的模块的地址信息和重定位信息等,我们就可以使用“CE Modules and Symbols”菜单命令打开如下的窗口:

利用“CE Exceptions”菜单命令则可以改变CE对异常响应的行为,窗口如下图所示:

利用以上的四个功能我们可以对CE的进程、线程、模块和异常响应进行必要的管理,也是以后常用的命令。如果想进一步的控制CE,我们还可以使用以下三个命令。

使用“Run Programs”命令可以在开发机上控制目标机中运行某个指定的程序,此命令运行后打开的窗口如下图:

如果我们在其中选择iesample.exe然后点击“Run”按钮,则会在目标机上发现IE浏览器已经运行起来了。如果开发的目标设备上无显示功能,则可以通过这个无程运行其中的程序。

还有一个“CE Target Control”的命令,它可以打开一个设备控制窗口,在其中输入设备控制命令后也能控制目标设备动作,如果有兴趣使用这些设备控制命令的话可以查一下PB的帮助。

另一个高级调试功能是使用调试区,它是CE中很常用的调试功能,具体它的代码实现及要求我们将在设备驱动程序中进行讲解,这里我们主要看一下它的应用方式,举个具体的例子,如果我们要跟踪目标机上键盘的动作以查看键盘驱动程序的工作情况,那我们就要用到调试区了。执行“CE Debug Zone”命令打开调试区窗口如下图:

左侧列表是模块名称,右侧是某一模块对应的调试区域,如上,我们选中kbdmouse.dll模块,右侧就列出了该模块的16个调试区,默认已经勾选了三个,所以当这个dll被调入内存执行时就会在PB的Debug窗口中输出它的初始化信息、警告信息和错误信息,如果我们想在Debug窗口中得到某个按键的扫描码,那么只要勾选Scan Codes项就可以了,确定以后,我们到目标设备上按键盘,就可以在开发机PB的Debug窗口上看到如下内容:

1468296 PID:63ef1802 TID:e3ec1eda 0x83ebe9f8: KeybdPdd_GetEventEx2: scan code 0x0000001c, code in progress 0x00000000, previous 0x00000000

1468296 PID:63ef1802 TID:c3ec4062 0x83ef1948: KeybdEventThreadProc: keybd 0 scan code 0x0000001c Down

1468296 PID:63fc9e0a TID:e3ed3e22 0x83eeee44: OpenSwMixer - no mixer found

1468296 PID:63fc9e0a TID:e3ed3e22 0x83eeee44: SPS - open failed : 0x1

1468300 PID:63fc9e0a TID:e3fc5a32 0x83eb1830: OpenSwMixer - no mixer found

1468300 PID:63fc9e0a TID:e3fc5a32 0x83eb1830: SPS - open failed : 0x1

1468425 PID:63ef1802 TID:e3ec1eda 0x83ebe9f8: KeybdPdd_GetEventEx2: scan code 0x000000f0, code in progress 0x00000000, previous 0x0000001c

1468430 PID:63ef1802 TID:e3ec1eda 0x83ebe9f8: KeybdPdd_GetEventEx2: scan code 0x0000001c, code in progress 0x00000000, previous 0x0000001c

1468430 PID:63ef1802 TID:c3ec4062 0x83ef1948: KeybdEventThreadProc: keybd 0 scan code 0x0000001c Up

这其中就是调试区返回给Debug窗口的信息,其实质就是在做kbdmouse.dll这个驱动程序时实现了对应的调试区。

好了,常规调试也好,高级调试也罢,目的只有一个,就是要排除程序中的错误,得到必要的信息,快试试吧!

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics