天天看點

《Windows CE嵌入式開發入門——基于Xscale架構》 第8章 調試與仿真

通過遠端控制程式,開發人員可以從主控端上遠端地對目标機的運作狀況進行監視和控制。主控端和目标機之間一旦建立了遠端控制連接配接,開發人員就可以進行下列操作:下載下傳主控端的檔案到目标機、監視目标機處理器的狀況和各個線程及程序、監視并且分析目标機核心或者應用程式的處理性能等。

在Platform Builder和Embedded Visual C++中都包含了下列遠端工具:

n     Remote Call Profiler

圖8-1  標明遠端工具

n    Remote File Viewer

n     Remote Heap Walker

n     Remote Kernel Tracker

n     Remote Performance Monitor

n     Remote Process Viewer

n     Remote Registry Editor

n     Remote Spy

n     Remote System Information

n     Remote Zoom-in

這些功具可以通過Platform Builder或者EVC中的Tools下的菜單來標明,如圖8-1所示。

每一個遠端控制程式在系統中都隻能運作一個執行個體。有一點要特别注意:Remote Call Profiler和Remote Kernel Tracker程式不能同時運作,由于它們都對系統内部調用進行了跟蹤,是以如果同時使用會引起采樣點緩沖區堆棧的沖突。其他的遠端控制程式中可以運作多個視窗。

在Platform Builder 4.0版本之前,Windows CE是不支援Remote Call Profiler程式的,但是支援其他遠端控制程式。在Platform Builder 4.0以後,平台對Remote Call Profiler提供了完美的支援。但是,通常對學習Windows CE的開發人員來說都使用Windows CE standard SDK,這個SDK對Remote Call Profiler的支援是很弱的。筆者使用Remote Call Profiler來連接配接Windows CE standard SDK的時候,經常發生目标機相關EXE檔案(ConPmon.exe)未能正常啟動的錯誤。在不斷的嘗試後發現這個問題的原因在于standard平台功能選擇的時候沒有加入profiling support選項,是以核心不支援性能評測程式。而大部分嵌入式軟體開發人員一般隻用EVC而不用Platform Builder,這樣就無法在standard SDK上進行profile程式驗證,如果使用的特定的SDK不支援profile的話,同樣也無法進行性能調整。後面的小節中将通過實驗來解釋如何使Remote Call Profiler正常運作,并且獲得開發人員所需要的、可了解的各種性能監測資料。

表8-1是Platform Builder和Microsoft Embedded Visual C++ 4.0提供的遠端工具的各種功能。

表8-1                                                   遠端工具的各種功能描述

工    具 功    能

遠端性能評測程式

(Remote Call Profiler)

提供了基于圖形界面的目标機性能檢測和分析功能。通過這個程式,開發人員不但能夠擷取目标機的運作資料,而且可以将這些資料以非常容易了解的圖形化的方式顯示出來,這些圖形化方式包括了調用樹結構、事件追蹤顯示,調用結點圖顯示。使用這個程式可以幫助開發人員尋找到系統或者應用程式的瓶頸所在。在linux中也有相關的性能測試程式,開源項目名稱為Oprofile,有興趣的讀者可以參考一下

遠端檔案浏覽程式

(Remote File Viewer)

顯示了目标機檔案系統中的各種檔案,開發人員還可以通過這個程式将主控端的檔案下載下傳到目标機,其内部原理可以基本認為是像linux那樣使用的FTP服務在主控端和目标機之間進行檔案傳輸
遠端堆檢視程式(Remote Heap Walker) 顯示了目标機上運作的各類程序的堆的使用情況

遠端核心跟蹤程式

(Remote Kernel Tracker)

顯示了目标機核心追蹤、執行順序的資訊

遠端性能監視程式

(Remote Performance

Monitor)

對目标機總體性能進行評估

遠端程序浏覽程式

(Remote Process Viewer)

對目标機的程序運作狀态資訊進行監視

遠端系統資料庫編輯程式

(Remote Registry Editor)

顯示了目标機的系統資料庫資訊,并且提供在主控端上對其進行修改的功能
遠端Spy程式(Remote Spy) 顯示了目标機上所打開的各個視窗的資訊,以及它們所産生的各種事件

遠端系統資訊擷取程式

(Remote System

Information)

顯示了系統的各種設定和屬性

遠端桌面圖像擷取程式

(Remote Zoom-in)

從目标機桌面擷取圖像

8.1  模拟器

正如各自平台功能的不同,Platform Builder下的模拟器用來調試核心、驅動,EVC下的模拟器用來調試應用程式、DLL等。模拟器能夠模拟Windows CE作業系統,使用主控端的硬體環境。在硬體平台還沒有成型的前提下,或者程式員開發與硬體無關的軟體時,模拟器能起到很大作用。模拟器啟動運作簡單,不像實際的開發闆的操作那樣複雜,即使想重新啟動模拟器多次,也不會花去很少時間。但是,模拟器運作在使用者态下,它畢竟是一個應用程式,是以它的實時性是無法保證的,它隻能一定程度上保證程式非實時性功能的正确性。

目前,模拟器隻支援x86平台,它隻适合調試基于“Emulator:x86”編譯的核心。但是可以調試所有基于x86指令集編譯的應用程式、動态連結庫、靜态連結庫。“Emulator:x86”在EVC的“WCE Configuration”工具欄中間編譯選項中可以找到。

關于模拟器的硬體限制:

n     僅能模拟DEC 2114x網卡驅動來提供網絡支援,其他網卡驅動不支援;

n     僅能模拟FLAT顯示驅動,其他顯示驅動不支援;

n     不支援USB裝置;

n     不支援PC卡、硬碟、CF卡;

n     不支援FAT、CDFS、DVD檔案格式;

n     不支援IEEE1394裝置。

如果模拟器配置使用了64MB位元組的記憶體,建議用以下配置:

n     1GHz CPU;

n     384MB系統記憶體;

n     500MB可用硬碟空間。

8.1.1  模拟器的架構

從體系結構來看,模拟器是一個桌面環境中的視窗應用程式,它模拟了目标機的各種硬體接口和操作,例如:PCI總線、聲霸卡、顯示卡等。

大多數作業系統隻允許處理器上運作單獨的作業系統,模拟器可以突破此限制,通過模拟硬體操作,直接通路主控端記憶體和處理器來實作一個處理器上運作多個作業系統。除了Windows CE的模拟器以外,還有其他的很多模拟器例如著名的VMWare、Virtual PC等。和那些通用的模拟器不同,Windows CE的模拟器隻能運作特定版本的Windows CE作業系統。

在開發中,程式員可以很友善地使用模拟器來調試核心和應用程式。但是,任何與時間限制有關的應用程式或者實時程式都不建議使用模拟器進行調試。在模拟器中,由于使用軟體模拟了硬體的操作,是以其時序和實際的硬體不完全相同,通常模拟器下的程式運作速度隻有同類主頻處理器的80%。是以微軟公司曾經提示,在模拟器上的程式性能與實際環境下的性能不完全相同。

在普通計算機的作業系統中,系統核心将防止系統級的處理程式在Ring 0或者Ring 1層執行,而把使用者态的程序放置在Ring 3層運作。但是模拟器上的所有程式都是作為Ring 3層來運作的,即便模拟器中作業系統的系統級程式也一樣,因為模拟器本身就是作為主控端的一個應用程式來運作的。

目前,模拟器隻支援x86晶片。

8.1.2  Platform Manager

在主控端和目标機之間的連接配接中,需要使用到Platform Manager。下面通過實驗來說明其用法。

實驗一:配置Platform Manager

Platform Manager管理着主控端和目标機的連接配接功能。在主界面中依次選擇Target→Configure Remote Connection可以打開圖8-2所示對話框:

圖8-2  配置Platform Manager(1)

我們以模拟器為例,進行配置。

首先在圖8-2所示的Download下拉框中選擇Emulator-4.20,在Kernel下拉框中也同樣選擇。然後單擊Download下拉框右側的Configure按鈕,将出現如圖8-3所示的對話框。

在圖8-3的示的ScreenSize中設定了模拟器的界面像素,對于Platform Builder這樣比較消耗記憶體的程式來說,還是盡量将像素減小,同時用256色(選擇8)。

在System選項組的Memory下拉選框中設定模拟器中預留給作業系統的記憶體,這部分記憶體隻是模拟器從主控端中配置設定的記憶體。一般配置成128MB足夠了。

單擊“OK”按鈕在配置完連接配接後,在主界面中單擊Target,可以看見Conncet指令可用了,這時才能連接配接主控端和目标機,下載下傳作業系統。如圖8-4所示。

         圖8-3  配置Platform Manger(2)             圖8-4  菜單配置Platform Manager後的Tanget

8.1.3  EVC++中的模拟器

實驗二:在EVC++中建立可以使用模拟器調試的應用程式

(1)從主界面的“File”中選擇“New Project”指令,進入如圖8-5所示的界面。

圖8-5  建立新工程(1)

(2)選擇MFC項目WCE MFC AppWizard(exe),并且在CPUs中選擇Win32 [WCE emulator],然後選擇OK。進入如圖8-6所示的界面。

(3)單擊OK按鈕後,根據向導提示繼續完成配置,在圖8-6所示界面中單擊Finish将完成新工程的建立,此時将出現圖8-7所示的開發。

圖8-6  完成工程建立

圖8-7  開發界面

(4)在開發界面中做如下選擇:

n     工程選擇helloworld

n     SDK選擇STANDARD SDK

n     版本選擇Win32(WCE emulator)Debug

n     模拟器選擇STANDARDSDK Emulator

如圖8-7所示。

(5)最後先後按下編譯快捷方式 和執行指令快捷方式 ,模拟器中将出現如圖8-8所示的程式運作界面。

圖8-8  編譯與執行界面

8.1.4  Platform Builder中的模拟器

Platform Builder中的模拟器和EVC中的大體功能是一樣的,但是Platform Builder可以把特定的功能編譯到SDK中去,然後EVC再安裝這個SDK後,才能使用新的功能。

總而言之,Platform Builder可以對模拟器中的作業系統的特性進行修改,而EVC隻能接受對Platform Builder做的改動。

8.2  遠端性能評測程式

8.2.1  Platform Builder中的性能評測程式

要使用Remote Call Profiler,必須在程式代碼中嵌入profiling鈎子,然後将代碼的鏡像檔案下載下傳到目标機中,再啟動目标機,連接配接主控端上的Platform Builder中的服務。

Remote Call Profiler不僅僅能監測應用程式,同樣也可以監測作業系統核心的調用。如果程式使用Platform Builder或者是EVC編寫的話,那麼可以直接使用兩個工具中的下載下傳鏡像檔案的功能。如果是用其他工具編寫的,那麼需要把鏡像檔案複制出來,首先啟動Platform Builder或者是EVC,然後啟動模拟器服務,再打開遠端檔案監視程式,将鏡像檔案通過export file功能傳輸到目标機上,然後在目标機上啟動(輕按兩下)該應用程式。這樣才能得到監測的資料。

在啟動被監測的程式之前,必須将Remote Call Profiler程式連接配接上目标機。

1.實驗

實驗三:建立和編譯支援Profile功能的核心以及SDK

标準SDK是不支援Profile的,下面介紹如何使用自己的SDK來支援Porfile功能。

首先本章實驗一介紹的方法定制一個平台請注意,本實驗的目的僅僅是使用Profile功能,而Windows CE是嵌入式作業系統中最消耗記憶體的,是以為了防止模拟器記憶體資源的不足,在定制的過程中可以盡量删除不必要的功能。另外,建議讀者在記憶體大于512MB的計算機上進行本實驗。

建立完平台之後,先别急着編譯,還有選項要設定,選擇圖8-2所示的Settings頁籤,進入如圖8-9所示的對話框。

圖8-9  設定選項(1)

選擇Build Options對話框,在Enable Profiling前打勾,這表明Windows CE核心将支援監測功能。

最好再記下這個平台的release目錄,如圖8-10所示,因為release目錄下的檔案将被複制到模拟器的/release目錄下,是以有任何需要在啟動時候下載下傳的檔案都可以放在這裡。

在筆者的計算機上,這個release目錄為G:/WINCE420/PUBLIC/Kaola/RelDir/EMULAT~1,EMULAT~1表示EMULATOR_X86Release,類似DOS對作業系統Windows作業系統的長短檔案名支援那樣。

圖8-10  設定選項(2)

單擊“OK”按鈕後,系統将記錄下編譯的配置。

然後在主界面依此單擊Build->Build Platform菜單,系統就進入平台編譯了。

圖8-11  選擇一個裝置

在編譯完系統核心後,再導出SDK。關于如何導出SDK,請參看前面的章節。

實驗完畢。

實驗四:在Platform Builder下使用Profile功能

在實驗三的基礎上進行如下操作。

啟動模拟器。首先連接配接Remote Call Profiler工具和模拟器,後下載下傳包含指定的包含Profile調試代碼的樣例程式到模拟器中。

連接配接Remote Call Profiler和模拟器。依此單擊Tools-> Remote Call Profiler,将彈出圖8-11所示的對話框,選擇Windows CE.NET Default Platform下的Default Device。

然後選擇“OK”。将進入如圖8-12所示的界面。

連接配接完成後,将彈出Collection Control的對話框,如圖8-13所示。

Collection Control視窗是在設定連接配接裝置之後彈出的視窗。隻能擷取嵌入有Profiling鈎子的代碼的監測資訊。

隻要在代碼中嵌入Profiling鈎子,無論是核心級或者是應用級的函數,都能得到它們的性能名額資料。如果要從應用程式擷取性能資料,那麼應當從Collection Control視窗中啟動相應的應用程式。

在此,使用微軟公司提供的例子來繼續實驗,這個示例程式位于Program Files/Common Files/Microsoft Shared/Windows CE Tools/Platman/sdk/wce420/samples/Hello目錄下。它是一個很簡單的helloworld程式。

圖8-12  連接配接裝置

圖8-13  Collection Control對話框

在Collection Control對話框中有個Launch按鈕,這個按鈕可以啟動在模拟器上My Computer下的可執行檔案。是以,需要把Callcap.exe的可執行檔案下載下傳到模拟器中去。Callcap.exe程式可以使用EVC編譯,編譯的時候要注意編譯成Debug版本,使用Release版本的話,後續的檢測資料就無法對程式内部的函數名稱進行解析。

可使用Remote File viewer來下載下傳檔案Callcap.exe。

按上述方法下載下傳完helloword.exe後,單擊Collection Control對話框中的Launch按鈕,彈擊圖8-14所示對話框。

然後按“OK”按鈕,将進入如圖8-15所示的界面。

         圖8-14  Launch對話框                圖8-15  在Collection Control對話框中顯示資訊

當Callcap.exe運作時候,Collection Control就會不斷地收到資料,當把模拟器中的Callcap程式關閉時,Collection Control也會自動停止收集資料。

在Collection Control中還有Pause按鈕,它是用來暫停資料采集功能,可以通過resume來恢複。

在結束了資料采集後,Remote Call Profiler将對資料進行分析,然後顯示在圖形界面上。如圖8-16所示。

圖8-16  資料分析界面

還可以從圖8-16所示菜單的View→New view指令中選擇Call Graph等功能,這些功能以圖形化的結點方式來顯示目标機程式調用的順序。下面簡要說明。

在選擇Call Graph後,系統将要求輸入可執行程式進行解析的Image檔案的路徑,如圖8-17所示。

圖8-17  輸入檔案路徑

正确的給出路徑,如果編譯使用的版本是release的話,解析将無法完成。

正确完成以上步驟後,将在Remote Call Profiler中将看到Call Graph的資訊,如圖8-18所示。

圖8-18  Call Graph資訊

可以看出,程序首先調用WinMain,其執行率為100%,也就是說所有代碼都在其下運作,然後調用WndProc,執行效率為90.99%。之後分為兩個分支:DoWork和WndProc總共占了87.7%左右的執行時間,也就是說,整個程式運作的時間中,剩餘12.3%的時間都由系統核心在占用處理器。

通過圖8-19所示的Time Line視窗也可以得到上述結論。

圖8-19  Time Line視窗

圖8-19中各種顔色定義如下:

紅色:0%-20%的時間在執行應用程式的代碼。

綠色:超過80%的時間在執行應用程式的代碼。

黃色:82%-80%的時間在執行應用程式的代碼。

灰色:所有時間都處于核心态或者其他線程的進行中。

可見,整個資料采樣時間中的确有很長時間花費在核心态中。

2.如何在程式中控制Profile功能

(1)在子產品中添加資料控制功能

在程式中先添加#include cecap.h包含頭檔案。這個頭檔案位于Sdk/Wce420/Platman/

Include目錄中。

可以在代碼中再添加StartProfile(ProfileLevel,PROFILE_CURRENTID);重新啟動資料監測收集。也可以在代碼中添加StopProfile(ProfileLevel,PROFILE_CURRENTID)函數調用來停止資料采集。

在以上的調用中,将ProfileLevel替換為常數。這些可選擇的常數以及它們的功能如表8-2所示。

表8-2                              StopProfile和Stop Profile函數的常數及其功能

代 表 含 義
PROFILE_GLOBALLEVEL 對系統中所有的程序和線程都有效
PROFILE_PROCESSLEVEL 對目前活動程序中的所有線程有效
PROFILE_THREADLEVEL 隻對目前活動線程有效

請注意,如果系統核心在編譯前設定了支援Profile功能,那麼所有應用程式預設都是被監測的,隻有通過StopProfile才能停止監測。

(2)添加Profile标記到.icp檔案

在代碼中實作向主控端的profiling data (.icp)檔案中傳輸函數被執行信号。隻要在響應函數中添加MarkProfile(MarkID)函數或者CommentMarkProfile(MarkID,TextString)函數或者CommentMarkAtProfile(TimestampValue,MarkID,TextString)便可在函數被執行時,将信号傳送到.icp檔案,這些信号可以在Call Trace中被使用到。

(3)Remote Call Profiler API函數集

Remote Call Profiler API函數集能使程式在運作時自動控制Profile功能,以此來控制監測的資料量,讀者可以想象,如果對一個龐大的程式系統進行檢測,如果不控制資料流量,可能會使目标機的緩存溢出,進而是資料丢失,資料采樣就失真了。在程式中可以直接使用以下的函數接口。

它們都在Cecap.h頭檔案中被申明這個頭檔案位于Sdk/Wce420/Platman/Include目錄中,表8-3所列是該頭檔案的函數接口和功能描述。

表8-3                                                 Cecap.h頭檔案的接口描述

接 口 函 數 功 能 描 述
StartProfile 将特定的profiling級别的start/stop計數器加1
StopProfile 将特定的profiling級别的start/stop計數器減1
SuspendProfile 将特定的profiling級别的suspend/resume計數器加1
ResumeProfile 将特定的profiling級别的suspend/resume計數器減1
MarkProfile 将profile标記插入主控端的.icp檔案
CommentMarkProfile 功能同上,但是在插入标記的同時,還能附加一個字元串
CommentMarkAtProfile 功能同上,但是在插入标記的同時,還能附加一個時間戳
NameProfile 為一個Profile元素命名

下面詳細分析表8-3所示函數的原型。

① StartProfile

int StartProfile(

  int nLevel,

  DWORD dwID

);

參數解釋:

n     nLevel

表示函數作用的系統級别範圍,dwID參數将根據這個參數确定值,分别如表8-4所示。

表8-4                                                           nLevel的參數值

功 能 描 述
PROFILE_GLOBALLEVEL 将影響到所有程序和線程的資料監測
PROFILE_PROCESSLEVEL 将影響到dwId參數指定的程序下的所有線程
PROFILE_THREADLEVEL 将影響到dwId參數指定的線程

n     dwID

這個參數指定了本函數作用的範圍。對于影響全局或者目前程序的情況下,本參數隻要設定成PROFILE_CURRENTID即可。如果是将影響到dwId參數指定的程序或者線程,那麼将本參數設定成它們的ID。

傳回值:

表8-5列出了傳回值和它們的含義。

表8-5                                                    StopProfile函數傳回值

描    述
PROFILE_OK 本函數調用是成功的
PROFILE_ERROR_NOT_YET_IMPLEMENTED 函數調用不成功。在各個級别上,資料監測都沒有被核心支援
PROFILE_ERROR_MODE_NEVER 在調用本函數啟動Profile時發現,資料監測功能被設定成never
PROFILE_ERROR_LEVEL_NO_EXIST 被指定的作用級别不存在
PROFILE_ERROR_ID_NO_EXIST dwId指定的對象不存在

② StopProfile

這個函數将減少start/stop計數器的值,當這個值減少到0時,資料監測就停止。

int StopProfile(

  int nLevel,

  DWORD dwID

);

參數解釋:

n     nLevel

指函數作用的系統級别範圍,dwID參數将根據這個參數确定值,參數值如表8-6所列。

表8-6                                                             nlevel參數值

功 能 描 述
PROFILE_GLOBALLEVEL 将影響到所有程序和線程的資料監測
PROFILE_PROCESSLEVEL 将影響到dwId參數指定的程序下的所有線程
PROFILE_THREADLEVEL 将影響到dwId參數指定的線程

n     dwID

這個參數指定了本函數作用的範圍。對于影響全局或者目前程序的情況下,本參數隻要設定成PROFILE_CURRENTID即可。如果是将影響到dwId參數指定的程序或者線程,那麼将本參數設定成它們的ID。

傳回值:

表8-7顯示了傳回值和它們的含義。

表8-7                                                    StopProfile函數傳回值

描    述
PROFILE_OK 本函數調用是十分成功的
PROFILE_ERROR_NOT_YET_IMPLEMENTED 函數調用不成功。在各個級别上,資料監測都沒有被核心支援
PROFILE_ERROR_MODE_NEVER 在調用本函數關閉Profile時發現,資料監測功能被設定成never
PROFILE_ERROR_LEVEL_NO_EXIST 被指定的作用級别不存在
PROFILE_ERROR_ID_NO_EXIST dwId指定的對象不存在
注意 StartProfile和StopProfile函數控制了Profile的start/stop計數器。這個計數器預設為1,即預設支援資料監測(如果編譯核心時選擇了相應的選項的話)。

當計數器值大于0時,對特定級别的資料監測就被啟動。當處于0或者負值時,便停止。

③ CommentMarkProfile

這個函數将一個數字值的标記和一個附屬的字元串插入到主控端的.icp檔案中。這個标記可以用來記錄某一段代碼的執行。Call Trace視圖中将顯示字元串。

int MarkProfile(

  long lMarkID,

  char* pszText,

);

參數解釋:

n     lMarkID

數字值标記,必須大于0。

n     pszText

指針,指向字元串,字元串中的字元數量必須少于256個,包括結束字元/0。

傳回值:

傳回值如表8-8所示。

注意 在調用CommentMarkProfile的時候,資料監測功能一定是要被打開的,否則操作會失敗。

表8-8                                           CommentMarkProfile函數傳回值

返  回  值 描    述
MARK_OK 函數調用成功
MARK_ERROR_MODE_OFF 在調用本函數啟動Profile時發現,資料監測功能被設定成OFF。資料被忽略
MARK_ERROR_MODE_NEVER 在調用本函數時發現資料監測功能被設定成never
MARK_ERROR_MARKER_RESERVED lMarkId參數中的值小于等于0,0是被保留的,是以操作被忽略
MARK_TEXTTOOLONG pszText中的字元超過256個,操作失敗

3.Callcap程式分析

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

{

    switch (message)

    {

        case WM_COMMAND:

            wmId    = LOWORD(wParam);

            wmEvent = HIWORD(wParam);

            // Parse the menu selections:

            switch (wmId)

            {

                case IDM_FILE_EXIT:

                   DestroyWindow(hWnd);

                   break;

                case IDM_WORK:

                    DoWork();

                    break;

                case IDM_LABEL:

                    DoLabel();

                    break;

                case IDM_MT:

                    DoMultiThread();

                    break;

                default:

                   return DefWindowProc(hWnd, message, wParam, lParam);

            }

    }

}

void DoLabel()

{

    SetCursor(LoadCursor(NULL, IDC_WAIT));

    double x = 0;

    CommentMarkProfile(10, "+DoLabel");

    for (int i=0; i<5; i++)

    {

        for (int j=0; j<100; j++)

        {

            DoWork3();

        }

        CommentMarkProfile(i, "Iteration");

    }

    CommentMarkProfile(10, "-DoLabel");

    SetCursor(LoadCursor(NULL, IDC_ARROW));

    MessageBox(0, L"DoLabel() Completed", L"Done", 0);

}

8.2.2  EVC中的性能評測程式

EVC中的監測程式基本和Platform Builder一緻,隻是受到SDK的限制。另外其圖形界面稍有所不同,如圖8-20所示。

圖8-20  EVC中的監測程式

8.3  遠端檔案浏覽程式(Remote File Viewer)

Remote File Viewer是類似于Windows桌面系統中資料總管的使用者界面。在開發環境中遠端檔案浏覽程式顯示出了所有目标機上的檔案資訊,包括目錄。通過這個工具,開發人員可以輕松地管理目标機上的檔案。此外,還可以通過Export和Import方式來向目标機存儲檔案或者提取檔案。

使用遠端檔案浏覽程式前,必須将其于目标機相連接配接。

實驗五:使用遠端檔案浏覽程式

在Platform Builder或者EVC中,選擇Tools→Remote File Viewer菜單指令,将彈出圖8-21所示的對話框,在這裡可以選擇連接配接的裝置。

單擊“OK”按鈕後,就可以使用遠端檔案浏覽器了。如圖8-22所示。

  圖8-21  選擇連接配接裝置                         圖8-22  遠端檔案浏覽器

圖8-23  向目标機輸出檔案

圖8-22所示左邊目錄樹列出的是模拟器運作的核心的所有目錄。右邊是指定目錄下的檔案。工具欄最右邊是導出和導入按鈕,這裡的導入和導出是相對開發平台而言的。

執行File→Export File菜單指令下可以執行下載下傳檔案的功能,可向目标機輸出檔案如圖8-23所示。

當選中檔案後,被選中的檔案将被下載下傳到在遠端檔案浏覽器中被選擇的目錄下。也可以執行删除檔案的功能。

8.4  遠端堆檢視程式

遠端堆檢視程式顯示了目标機上各個程序的辨別,以及它們狀态的資訊。要使用這個工具,必須先目标機。

在這個工具中可以詳細地記錄程序使用記憶體的情況,這樣就可以判别程序是否釋放了申請的記憶體,應用程式是否發生了記憶體洩露。利用“遠端堆檢視程式”還能夠檢視到:

n     核心中正運作的程序的名字、ID,及使用的所有的堆的ID,如圖8-24所示;

n     程序的任意一個堆中的首位址、結束位址及标志;

n     堆中每塊(Block)的實際内容。

運作此程式後,先列出系統内所有堆的資訊。堆的資訊包括堆ID、程序ID、程序名、堆的标志。圖8-24所示中堆的标志隻有一個值“HF32_DEFAULT”,表示這個堆是系統預設配置設定的堆。圖8-24所示中有4個堆所在程序都為“device.exe”,從程序ID可以看出這是一個程序,而不是一個應用程式的4個執行個體。

圖8-24  核心中正在運作的程序清單

輕按兩下清單中任何一項,會彈出一個視窗列出這個堆中包含的塊的資訊。塊的資訊包括塊的首位址、大小、标志。配置設定了一個堆,就可以在堆中配置設定數組、結構等,這個塊就指每個配置設定的元素。塊标志為“Fixed”則表示不能釋放這個塊占據的記憶體空間,而為“Free”則相反,表示能夠釋放這個塊占據的記憶體空間。

8.5  遠端核心跟蹤程式(Remote Kernel Tracker)

Remote Kernel Tracker用于跟蹤實際的硬體裝置中Windows CE核心的執行情況。開發人員可以使用這個工具來對目标機的系統整體運作進行監測。這個程式能夠跟蹤所有程序中的所有線程的執行情況,包括了系統中斷、程序間通信、互相間的依賴等。它從程序開始運作起跟蹤,跟蹤結束的時間由資料接收緩沖區的大小決定。緩沖區的大小從1MB到100MB,由使用者自己設定。跟蹤内容為程序是否運作、線程的運作、阻塞和睡眠。在此程式的右邊有所有能夠跟蹤的事件對應的圖示。

要跟蹤一個核心的啟動情況(啟動後也能使用這個工具跟蹤所有程序、線程),先要使要跟蹤的核心具有幾個特性。在PlatformBuilder菜單“Platform”→“Settings”,在彈出的對話框中選擇頁籤,“Build Options”選中“Enable Event Tracking During Boot”和“Enable Profiling”複選框,單擊OK按鈕,然後重新編譯整個核心。注意在編譯時可能提示産生錯誤,如果出現這種情況那就重建核心。如果編譯的是retail版本的核心,則系統預設支援Remote Kernel Tracker。如圖8-25所示。

圖8-25  資料記錄

編譯成功後,先打開遠端核心跟蹤程式,在平台選擇對話框中單擊“OK”,這時立刻單擊主界面的“Download”→“Initialize”調出模拟器。等待一會遠端核心跟蹤程式就将整個啟動過程中發生的所有情況記錄并顯示出來。線程在哪個時間段運作、睡眠、阻塞,包括發生中斷的時間、中斷号等都記錄下來,如圖8-25所示。缺點就是資料量太大。這個程式提供了查找功能和過濾功能,查找功能可以查找想要找的事件,而過濾功能可以讓此程式隻記錄希望記錄的事件。最後還可以儲存記錄的所有資料,儲存到擴充名為.clg的檔案中。

8.6  遠端性能監視程式(Remote Performance Monitor)

Remote Performance Monitor是圖形化的,用來測試Windows CE.NET系統整體性能。利用這個工具,開發人員可以簡單清晰地監視性能對象的運作狀态,例如CPU、線程、程序以及系統記憶體。每個性能對象都有自己的計數器隊列,這些計數器描述了對象的裝置使用狀态,引用計數、緩存隊列長度以及延遲等。Remote Performance Monitor能将這些資料提取出來顯示。

在将工具和目标機連接配接後,便可以查詢性能對象的狀态。此外還可以添加性能對象。

以下是添加性能對象的大緻步驟。

(1)在Edit菜單中選擇Add To Chart。

(2)在彈出的對話框中選擇一個性能對象。

(3)在計數器對話框中做出選擇。

(4)如果可以的話,在Instance對話框中做出選擇。

(5)儲存退出。

Remote Performance Monitor支援下列的性能對象:

n     Remote Access Server (RAS)

n     Internet Control Message Protocol (ICMP)

n     TCP

n     IP

n     User Datagram Protocol (UDP)

n     Memory

n     Battery

n     System

n     Process

n     Thread

在Remote Performance Monitor中可以通過表8-9所示的4種方式來檢視性能資料。

表8-9                           Remote Performance Monitor檢視性能資料的方式

視    圖 功 能 描 述
Chart 支援實時資料的監測
Alert 當目标機的運作狀态達到某一指定狀态時,顯示資料

續表

視    圖 功 能 描 述
Log 将資料存儲到日志檔案中
Report 用文本方式顯示資料

如圖8-26所示,為向Remote Performance Monitor工具添加要檢視的對象參數。

圖8-26  添加要檢視的對象參數

如圖8-27所示是被選擇的%Processor Time的活動圖表。

圖8-27  選擇的%Processor Time的活動圖表

8.7  遠端程序浏覽程式

遠端程序浏覽程式(Remote Process Viewer)共三個視窗,分别顯示目前核心中所有程序、程序中的線程及程序中所有加載的DLL。如圖8-28所示。在顯示程序的視窗中,分别顯示程序名、程序ID、基本優先級級别、擁有的線程總數、基位址、通路鍵值、主視窗名。在顯示線程的視窗中,分别顯示線程ID、目前程序ID、線程優先級、通路鍵。在顯示DLL子產品的視窗中,分别顯示子產品名、子產品ID、目前程序使用計數、全局使用計數、基位址、大小、子產品句柄、路徑。這裡要說明的是線程視窗中的“目前程序ID”。線程視窗應該顯示目前指定程序下的所有線程,怎麼會有不同的程序ID呢?這涉及到Windows CE驅動模型。如“explorer.exe”,它包含的線程中就有兩個在“目前程序ID”中顯示為程序“gwes.exe”,“gwes.exe”為圖形、視窗、事件子系統。它負責畫出圖形和視窗以及收發視窗消息。“explorer.exe”的線程在顯示視窗、收發消息時調用“Coredll.dll”,這個DLL調用圖形、視窗、事件子產品。這些子產品實際上是驅動程式(DLL),由gwes.exe來加載、執行、管理這些DLL。當執行此遠端調試工具時,此工具會調用ToolHelp函數集快照系統某一時刻的程序、線程、DLL資訊。

圖8-28  遠端程序浏覽器

8.8  遠端系統資料庫編輯程式

遠端系統資料庫編輯程式(Remote Registry Editor)和其他Windows 作業系統下的系統資料庫編輯器非常相似,但它能夠同時顯示、編輯開發平台中的系統資料庫和實際裝置中的系統資料庫資料。如圖8-29所示。具體操作和其他系統資料庫編輯器一樣,在操作時首先要區分哪個是開發平台中的系統資料庫,哪個是實際裝置中的系統資料庫。Windows CE下系統資料庫的限制是鍵名最大長度255個字元,資料最大4KB,子鍵深度最大值16層。

圖8-29  遠端系統資料庫編輯器

8.9  遠端桌面截取程式

遠端桌面截取程式(Remote Zoomin)能夠在計算機上顯示一幅從遠端裝置上截取的螢幕圖像。啟動Remote Zoomin時,桌面計算機會從目标裝置下載下傳一幅螢幕圖像的BMP圖。使用Remote Zoomin還可以縮放目标裝置的螢幕截圖或者拷貝螢幕截圖到剪貼闆。如圖8-30所示。

圖8-30  遠端桌面截取

8.10  遠端系統資訊監控程式

遠端系統資訊監控程式(Remote System Information)工具能使開發者在計算機上直接檢視遠端裝置上的系統資訊情況,如記憶體、電源狀态、存儲、裝置等。如圖8-31所示。

圖8-31  遠端系統資訊

8.11  遠端消息監視程式

遠端消息監視程式(Remote Spy)和Visual C++下附帶的工具spy非常相似。能夠截獲并列出所有實際裝置中的視窗資訊和視窗消息。要監視某一個視窗,先在視窗清單中選擇這個視窗,然後系統發送到這個視窗的所有視窗消息都被截獲并在“Messages”視窗中顯示出來。在“Messages”視窗中列出消息名、兩個32位參數值等。如圖8-32所示。

圖8-32  遠端消息監視

8.12  CEPC的探讨

在目标裝置上調試作業系統鏡像

Platform Builder支援通過串行/并行端口、以太網和(通過附加元件元件)JTAG/BDM将作業系統映像下載下傳到裝置。我們需要先配置下載下傳并調試傳輸,然後才能下載下傳作業系統映像,這一部分我們将根據CEPC方式講解如何進行調試。

1.制作啟動目标裝置的軟磁盤

① 在安裝Platform Builder路徑下,查找Websetup.exe檔案,滑鼠輕按兩下運作這個程式這個檔案具體位置是:G:/Program Files/Windows CE Platform Builder/4.20/cepb/utilities。

運作這個程式之前要安裝另外一個程式到C:/Windows(如果Windows目錄在C:盤的話)目錄下,注意這個目錄不要修改,提示安裝完成後單擊“OK”按鈕。

② 輕按兩下同Websetup.exe在同一目錄下的Cepcboot.144檔案,在彈出的對話框中,有兩個按鈕分别是“A Drive”和“B Drive”,現在一般計算機隻有一個軟驅,是以我們在A驅動器内放入一張軟磁盤,單擊“A Drive”這個按鈕,對話框的進度條會顯示安裝檔案拷貝到軟磁盤的進度,當拷貝完成後單擊“Cancel”按鈕,退出這個程式。

③ 檢查你建立的啟動軟碟,檢視一下是否包含所有需要的檔案,為了更好的檢視,請将系統檔案夾選項中的隐藏框的對号去掉,并且選顯示所有檔案。

在這張軟磁盤中應該包括如表8-10所示的檔案:

表8-10                                                   軟磁盤中包含的檔案項

文 件 名 字 說    明
Autoexec.bat MS-DOS需要的自動批處理檔案
Commond.com MS-DOS下在三個啟動檔案之一
Config.sys MS-DOS下的系統配置檔案
Drvspace.bin 一個二進制檔案,用于支援一個驅動器
Eboot.bin 二進制檔案,用于以太網啟動
Himem.sys MS-DOS下的記憶體配置檔案
Io.sys MS-DOS下的三個啟動檔案之一
Loadcepc.exe 可執行檔案,加載這個Eboot.bin引導加載鏡像
Msdos.sys MS-DOS下的三個啟動檔案之一
Readme.txt 一個說明的文本檔案
Sboot.bin 二進制檔案,用于序列槽啟動
Sys.com MS-DOS下的應用程式,主要将系統傳到目标盤上
Vesatest.exe 可執行檔案,用于測試顯示卡上的VGA BIOS,以確定可以相容基于Windows CE驅動程式,Readme.txt檔案中有更詳細的資訊來講解這個檔案的用法

④ 修改啟動軟磁盤上的Autoexec.bat檔案,與目标裝置上的以太網卡相比對。

如果以太網卡是PCI總線的,則設定NET_IRQ等于9,而且NET_IOBASE等于0。

如果以太網卡是ISA總線的,則設定NET_IRQ與NIC IRQ相等,設定NET_IOBASE與NIC I/O相等。

2.下載下傳作業系統鏡像到目标裝置

本節講解如何建立并配置一個以太網連接配接,來連接配接到目标裝置,并且下載下傳作業系統鏡像到目标裝置。

在開始連接配接、下載下傳作業系統鏡像時,先要确定目前開發的計算機與目标裝置在同一子網内。

下面開始對每一步進行講解:

① 在Platform Builder中,選擇“Target”菜單,單擊“configure Remote Connection”。

② 選擇“Services”頁籤。

③ 從Download字樣下面的組合框中選擇Ethernet。

圖8-33  配置以太網下載下傳服務對話框

④ 單擊上面選擇Ethernet的組合框後面的“Configure...”按鈕,彈出一個新的對話框,如圖8-33,同時将在8.12節中“1:制作啟動目标裝置的軟磁盤”中建立的軟碟插入到目标機的軟驅内并啟動目标裝置。

在目标裝置啟動後,這個目标裝置的名字會出現在圖8-33中Available Devices:處的清單中。

⑤ 從Available Devices處選擇目标裝置名,并單擊“OK”按鈕。

⑥ 在圖8-2所示對話框的Kernel選項Ethernet下拉清單中選項。

⑦ 選擇Settings頁籤,在Download/Initialize Device中,檢視Connect to Device是否已經被選擇,如果沒有被勾選,就将其勾選上。

⑧ 單擊Target菜單,單擊Download/Initialize菜單項。

⑨ 等待作業系統鏡像的下載下傳完畢。

使用以太網連接配接,下載下傳的時間與以太網速度及作業系統鏡像的大小有關,在下載下傳時,一個對話框會顯示在PC機的內建開發環境中,提示你現在正在下載下傳的速度。

在作業系統鏡像下載下傳完成并在目标裝置上正常啟動後,你就可以調試這個作業系統鏡像了。

繼續閱讀