在《如何診斷Windows CE的應用程式崩潰》一文中我介紹了如何利用Remote Process Explorer的Crack Address功能定位程式的崩潰地址。但是看起來還是有很多人不知道怎麼使用這個工具,這篇文章詳細介紹一下。
首先要確保你的PC上有dbghelp.dll。微軟沒有公開PDB檔案格式,不過有解析PDB檔案的API,在dbghelp.dll中提供,最新版本可在微軟網站上下載。在微軟推出.NET Framework之前,基於COM組件編程很流行,因此微軟也以COM組件的形式提供了另外一組介面,叫DIA(Debug Interface Access)。Remote Proecess Explorer用dbghelp.dll解析WinCE偵錯符號,由於WinCE的可執行程式模組使用PE格式,偵錯符號檔案使用PDB格式,和Windows案頭平台一樣。因此它也可以分析Windows傳統型應用程式地址。dbghelp.dll可以放到系統目錄(c:\windows\system32),或者放到remote process explorer所在目錄。
其次應該把EXE/DLL和PDB放在一個目錄。如果放在不同目錄,dbghelp可能會找不到PDB。
具體用這個工具有幾步。舉個例子來說明,比如要定位下面的崩潰地址PC=03f7e034:
RaiseException: Thread=8d5108b0 Proc=81a37040 'device.exe'
AKY=00000205 PC=03f7e034(coredll.dll+0x0001e034) RA=80120ef4(NK.EXE+0x00020ef4) BVA=00000001 FSR=00000001
從PC=03f7e034(coredll.dll+0x0001e034) 這句我們知道三個重要訊息:崩潰模組coredll.dll,崩潰地址0x03f7e034,模組載入基地址0x03f7e034-0x0001e034=0x03f60000。CE5以前的版本不會顯示(coredll.dll+0x0001e034),基地址不能直接算出來。不過一般來說這些DLL如果你的系統沒有做過很大改變,每次載入的基地址是一樣的,所以你可以把系統運行起來查看它的載入基地址。
根據這三條資訊Remote Process Explorer就可以工作了:
1,Cracking Address填崩潰地址:0x03f7e034
2,base address填基地址:0x03f60000
3,模組路徑欄填coredll.dll的全路徑,可以用右面的按鈕定位。
現在可以試著按第三行的尋找按鈕(有一個放大鏡的表徵圖)。順利的話應該就能提示源檔案路徑、函數名和程式碼。在設當設定了偵錯符號搜尋路徑和源檔案搜尋路徑後,下面的文字框還能直接顯示原始碼,崩潰行用紅色標出。搜尋路徑在"File --> File Path..."對話方塊裡設定(多個路徑用分號;分隔):
由於產生PDB時的源檔案路徑和我們安裝Platform Builder的WINCE路徑肯定不一樣,因此最下面的"Source Path Mapping"還要做一些路徑映射,方便Remote Process Explorer搜尋原始碼。