原文:http://www.cnblogs.com/xFreedom/archive/2011/05/14/2046191.html
在調試WinCE程式的時候,有時候會碰到Data/Prefetch Abort的異常,相信從事過WinCE開發的人對這種異常資訊應該都不會陌生,系統會在偵錯主控台輸出如下類似資訊:
Exception 'Prefetch Abort' (3): Thread-Id=05870016(pth=9970c000), Proc-Id=057c0016(pprc=9973cdd4)‘TCPClient.exe’,VM-active=057c0016(pprc=9973cdd4) 'TCPClient.exe'PC=00000004(???+0x00000004) RA=00011254(TCPClient.exe+0x00001254) SP=0011f954, BVA=00000004
如:
Prefetch Abort和Data Abort的定位方法一樣。
其中RA=00011254就表示產生異常的地址,也可以通過TCPClient.exe+0x00001254中的
0x00001254 + 0x00010000 = RA=00011254來計算。為什麼是加上0x00010000呢?
開啟map檔案,找到Preferred load address is 00010000的一段資訊,你就明白要加上多少了。
在map檔案中找到比0x000011254小且最接近的一個值,本程式中為0x00011108,如:
就可以判斷是該函數中出了問題,要想找到具體出錯在那一行,還得利用.cod檔案進行定位。
SocketThreadFunc函數的起始地址為0x00011108,錯誤處的位移地址為:
0x14C = 000011254 - 0x00011108(可以用windows計算機計算)。計算出位移地址後,開啟cod檔案,尋找0x14C出現的位置,可以用記事本開啟cod檔案,用Ctrl+F尋找14C,會定位到如下資訊:
前邊的;127就表示錯誤發生在代碼中的第127行,分號應該是注釋吧。
VS2005預設不會產生.map檔案和.cod檔案,修改以下兩處就可以產生這兩個檔案了:
1.(.map)檔案:在工程目錄上右鍵->Properties->Configuration Properties->Linker->Debugging->Generate Map File(選擇Yes(/MAP));
2.(.cod)檔案:在工程目錄上右鍵->Properties->Configuration Properties->C/C++->Output Files->Assembler Output(選擇Assembly,Machine Code and Source(/FAcs))。
PS:
根據個人開發經驗,分析map檔案,還可以上網找一個map檔案分析器,這樣定位異常代碼比較快捷,自己搜尋map檔案,比較費時。
另外,這種分析方法,個人覺得也不一定100%有效。有時候遇到一些異常是來自庫檔案就比較麻煩。