WinCE中的Data/ Prefetch Abort異常定位

來源:互聯網
上載者:User

原文: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%有效。有時候遇到一些異常是來自庫檔案就比較麻煩。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.