一、模拟器
模拟器(emulator)是PB的一部分。专用于调试在PB下创建的内核及应用程序。模拟器能够在PC下模拟Windows CE的物理平台。但实际上它只不过是一个运行在CPU Ring 3级别的用户程序。所以它的运行速度要比正常的物理平台要慢。模拟器仅支持x86平台,它只能调试基于"Emulator:x86"的内核和所有用x86 指令集编译的程序。模拟器有很大的限制,这些限制使它只能运行简单的应用程序。但是有一点是好的,操作系统的大多数API对于任何CPU而言都是相同的。考虑到不受CPU类型影响的简单程序,还是可以在模拟器上调试的。在实际开发中我只用模拟器调试软件的界面。如果你想学习PB,用它来创建内核而又没有实际的物理平台来调试,那么模拟器非常适合。但模拟器的限制也非常多,所以即使你在模拟器下调试过所有能够调试的内核特征(feature,或者称组件),你掌握的也不过是冰山一角。在这里顺便说一句闲话:PB包含的知识量和Windows CE本身的知识量加起来好比是浩瀚的海洋,比用EVC开发软件的知识量大的多。所以如果你只会用EVC开发几个软件,那你仍然是Windows CE专业的一年级学生。
图一 模拟器
关于模拟器的硬件限制:(摘自Windows CE帮助)
仅能模拟DEC 2114x 网卡驱动来提供网络支持,其它网卡驱动不支持。仅能模拟FLAT显示驱动,其它显示驱动不支持。不支持USB设备不支持PC卡、硬盘、CF卡。不支持FAT、CDFS、DVD文件格式。不支持IEEE1394设备。微软推荐的使用模拟器的开发平台的配置:
1 GHZ CPU384 MB 系统内存500 MB 可用硬盘空间
二、创建内核并下载到模拟器上
为了测试远程调试工具,我们必须先使用PB v4.1创建一个内核:
使用新内核向导创建内核:单击PB的"New Platform",在"step 2"的"Available BSPs"中选择"EMULATOR:X86",接着在"step 3"的"Available configurations"中选择一个预定义的内核配置,这些预定义的内核配置具有针对性。在这里我们选择"Internet Appliance"。注意:有些预定义的内核配置附带了外壳程序,有些没带。选择之后,填写工程名(例如Internet)和工程的保存路径。默认 "step 4"的选项,在"step 5"中去掉所有复选框。因为我们只要内核和外壳就行了。同样去掉"step 6"中所有复选框。最后一步单击"Done"按钮。编译这个新内核:在菜单"Platform"-"Settings"-"Environment"中,单击"New",在弹出对话框中添加变量名"IMGRAM64"和值"1"。然后单击"Build"-"Build Platform"开始编译。具体编译的时间和你的机器配置有很大关系。配置模拟器:编译成功后,单击"Target"-"Configure Remote Connection",在弹出的对话框中找到"Download"下拉框,选择"Emulator",单击后面的"Configure",在弹出的对话框中设置分辨率为800 X 600或640 X 480。系统内存设置为64MB。单击"OK"后,在"Kernel"下拉框中选择"Emulator"。单击"OK"。启动模拟器:单击"Target"-"Download Initialize"。等待一会,模拟器就出来了。可以看到标准外壳的界面,也就是桌面。在PB中编写一个应用程序并下载到模拟器:
在打开了内核工程的前提下(如果刚打开PB,先打开一个内核工程)。单击PB菜单"File"-"New Project or FIle"。余下的步骤我就不用多说了。和EVC一样,添个工程名就可以编码了。只是没有MFC、ATL的支持。在这里选择一个显示"hello world"的SDK程序。然后单击"Build"-"Build All"编译程序。我一般不在PB下开发软件。麻烦!在模拟器已经打开的前提下,单击"Target"-"Run Programs",找到你的程序名,再单击"Run"。在模拟器上就可以看到你的程序了。关闭操作:先关闭模拟器。再单击"Target"-"Disconnect"。
三、远程调试工具
远程调试工具用于在开发平台与实际平台间执行一些调试工作。利用远程调试工具可以在开发平台运行,得到实际平台上的文件、监视实际平台上进程或线程的状况、测试实际平台上应用程序的性能等。一部分远程调试工具是我们在开发应用程序时常用的,还有一部分是开发内核时常用的。对于不常用的远程调试工具,我在这里只给予简单的介绍。
远程调用评测程序(Remote Call Profiler)
远程调用评测程序包含评测和分析工具。利用图形图像显示出你的代码中算法的效率或者占用资源情况。远程调用评测程序包含一系列接口函数。在你想要评测的代码中调用这些接口函数,然后运行你编写的程序。远程调用评测程序就能够接收你编写的程序的数据并记录。最后利用图形显示出来。显然这个工具我们并不常使用。尤其是开发非实时性内核和软件,加上目前的嵌入式微处理器处理速度已经很快了,对于一个软件性能的评测的需求就淡化了。当然,你要是愿意,觉得有必要也可以研究一下它的接口函数,然后测一下。我目前可没这个时间。微软提供了例子程序"hello"。如果你把Windows CE安装在C盘,那么路径为:
"C:\Program Files\Common Files\Microsoft Shared\Windows CE Tools\Platman\sdk\wce410\samples\hello"。
我编译了此程序并测试了一下。远程调用评测程序显示的图形如图2所示。
图二 评测图像截图
远程文件浏览程序(Remote File Viewer)
远程文件浏览程序是最常用、最易操作的工具之一。它的作用就是向实际平台导入或导出文件。假如我在调试一个显示位图的程序。位图允许用户自行选择。那么要在模拟器下调试,就必须将位图文件先导入到模拟器中。
模拟器打开后,运行远程文件浏览程序,先弹出一个对话框,要你选择访问哪个平台。如图3所示。
图三 平台选择对话框
选择"Default Device"后。主窗口就显示出来了。如图4所示。左边目录数列出的是模拟器运行的内核的所有目录。右边是指定目录下的文件。工具栏最右边是导入和导出按钮。这里的导入和导出是相对开发平台而言的。接上个例子所说,要将一个位图文件传到模拟器中。先单击导出按钮(上箭头),在弹出的对话框中选择一个位图文件,确定后,这个文件就出现在远程文件浏览程序的右边文件窗口中了。导入也简单,先选择一个文件,再单击导入按钮,再选择路径,保存即可。
图四 远程文件浏览程序截图3、远程堆查看程序(Remote Heap Walker)
显然“Walker”不能翻译成“查看”。你愿意怎么翻译就怎么翻译吧。在这里我就叫查看了,这样容易理解。从名字就可以看出它是用来查看操作系统中每个进程使用的堆的情况。什么是堆就不用我说了吧!堆大家都了解,但是CE下关于堆的知识也值得一说。以后我会有专门讲述CE下进程、线程、和内存管理方面的文章发表,那时会说的非常详细。利用“远程堆查看程序”能够查看到:
内核中正运行的进程的名字、ID、及使用的所有的堆的ID。如图1所示进程的一个堆中的首地址、结束地址、及标志(Fixed、Free)堆中每块(Block)的实际内容
图 1 进程列表
查看和使用这个工具是很简单的事情。不过前提是你对堆有所了解。下面我说说和这个工具有关的涉及到堆的知识。CE下每个进程启动时,系统会自动分配 192KB的局部堆给这个进程。要是不够你就通过调用堆管理函数自己再分配自定义大小的堆。自己分配的堆,包括系统给你分配的堆,都由ID来标识。如图中所示的Heap ID。进程ID和进程名就不用说了。后面的“Flag”只有一个值“HF32_DEFAULT”,表示系统默认分配的堆。图中的“device.exe”,有四个都一样。但从进程ID就可以看出这是一个进程,而不是一个应用程序的四个实例。因为列表是以堆为单位, “device.exe”分配了四个堆,就显示了四个。
双击列表中任何一项,弹出这个堆的包含的块的列表。列出块的首地址、大小、标志。我们分配了一个堆,就可以在堆中分配数组、结构等。这个块就指每个分配的元素。标志中“Fixed”表示不能释放这个块占据的内存空间。而“Free”则相反,表示能够释放这个块占据的内存空间。看到这,也许你会有疑问,标志给谁看的?由谁释放啊?这涉及到内存的管理,内核的OOM组件。在以后的文章中我会做详细的解释。
再单击每个块,在弹出的列表中就可以看到这个块的具体数据了(用ASCII表示)。
4、远程内核跟踪程序(Remote Kernel Tracker)
远程内核跟踪程序用于跟踪实际平台内核的执行情况,一般使用它跟踪内核的启动情况,搜集相关数据并在开发平台上以图表形式显示出来。如图2所示。这个程序能够跟踪所有的进程和进程中的所有线程。从开始运行起跟踪,跟踪结束的时间由数据接收缓冲区的大小决定。缓冲区的大小从1MB到100MB,由用户自己设定。跟踪内容为进程的运行、不运行,线程的运行、阻塞、睡眠。还有在线程中所有发生的同步事件。在此程序的右边有所有能够跟踪的事件对应的图标。
要跟踪一个内核的启动情况(启动后也能使用这个程序跟踪所有进程、线程),先要使你要跟踪的内核具有几个特性。在PB菜单“Platform”- “Settings”-“Build Options”中复选“Enable Event Tracking During Boot”和“Enable Profiling”。然后重新编译整个内核。(注意PB在编译时可能提示产生错误,如果出现这种情况,那就重建内核)
编译成功后,先打开远程内核跟踪程序,在弹出的平台选择对话框中(上篇文章中包含此图)按“OK”,这时立刻单击PB的 “Download/Initialize”调出模拟器。等待一会远程内核跟踪程序就将整个启动过程中发生的所有情况记录并显示出来。哪个时间段线程运行或睡眠或阻塞,包括发生了哪个中断都记录下来。缺点就是数据量太大。这个程序提供了查找功能和过滤功能。查找功能可以查找你想要找的事件,而过滤功能可以让此程序只记录你想要的事件。最后还可以保存这些记录数据。保存到扩展名为“.clg”的文件中。
这个工具我只能讲这么多了,平时很少用到。
图 2 跟踪情况截图
5、远程性能监视程序(Remote Performance Monitor)
这个程序的界面大家一定很熟悉了。和其它Windows操作系统中附带的性能监视器界面非常相似。如图3所示。操作也几乎一样。
图3 性能监视程序截图
它能够监视Remote Access Server (RAS)、Internet Control Message Protocol (ICMP)、TCP/IP、User Datagram Protocol (UDP)、Memory、Battery、System、Process、Thread。
6、远程进程浏览程序(Remote Process Viewer)
此程序共三个窗口,分别显示当前内核中所有进程、进程中的线程、及进程中所有加载的DLL。在显示进程的窗口中,分别显示进程名、进程ID、基本优先级级别、拥有的线程总数、基地址、访问键值、主窗口名。在显示线程的窗口中,分别显示线程ID、当前进程ID、线程优先级、访问键。在显示DLL模块的窗口中,分别显示模块名、模块ID、当前进程使用计数、全局使用计数、基地址、大小、模块句柄、路径。这里要说明的是线程窗口中的“当前进程ID”。当前进程 ID会有不相同的时候,奇怪!线程窗口应该显示当前指定进程下的所有线程,怎么会有不同的进程ID呢?因为CE帮助中什么都没说,所以请允许我设想一下:比如“explorer.exe”,它包含的线程其中就有两个在“当前进程ID”中显示为进程“gwes.exe”,“gwes.exe”为图形、窗口、事件子系统。它负责图形和窗口以及窗口消息。“explorer.exe”的线程在显示窗口、收发消息时调用“Coredll.dll”(以后会具体讲解此DLL),这个DLL调用图形、窗口、事件模块。这些模块实际上是驱动程序(DLL),由gwes.exe来加载、管理这些DLL。所以显示当前进程为 “gwes.exe”。目前只能这么解释了。
图4 进程浏览程序截图
7、远程注册表编辑程序(Remote Registry Editor)
此程序和其它Windows 操作系统下的注册表编辑器非常相似。但它能够显示、编译开发平台下的注册表和实际平台下的注册表。如图5所示。具体操作我就不多说了。CE下注册表的限制我也曾说过了。
图5 注册表编辑器截图
8、远程消息监视程序(Remote Spy)
这个程序和VC下附带的工具spy非常相似。能够列出所有实际平台下的窗口和窗口消息。我想这个程序也不用我多说了吧。熟悉VC下的工具,就能操作这个工具。界面如图6所示。
图6 消息监视界面截图
9、远程系统信息(Remote System Information)
这个工具能够查看实际平台的系统信息,包括硬件和软件的信息。
图7 系统信息截图
10、远程屏幕截图程序(Remote Zoom-in)
此工具能够截取实际平台屏幕图像。这个工具最适合写说明书了。假如一个产品要推向市场,那说明书或演示程序必须准备好。用这个程序截图放到说明书或演示程序中。截图单击“File”-“New Bitmap”。这个程序的界面我就不给出了。
总结
10个远程工具为我们开发内核和应用程序提供了很大的帮助。显然有些工具很少用,有些工具常用。对于注册表编辑器,在一些嵌入式网站有源码和程序可下载。把注册表编辑器带到内核中运行会更有效,更节省时间。这10个工具中,最帅的就是内核跟踪程序了,通过内核跟踪程序,整个内核启动过程清晰可见。还可以用它监视你的应用程序。有一点还要说明:这10个远程调试工具我是在模拟器上试验的。如果要调试实际平台,必须先通过串口、网卡把开发平台和实际平台连接起来。在“Target”-“Configure Remote Connection”中设置。实际设备最好有网卡,串口的速度太慢了。这方面请参考帮助文件,帮助文件中说的非常详细了。