• WinCE中的Data/ Prefetch Abort异常定位


    原文: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%有效。有时候遇到一些异常是来自库文件就比较麻烦。

  • 相关阅读:
    Android 3.0 r1 API中文文档(108) —— ExpandableListAdapter
    Android 3.0 r1 API中文文档(113) ——SlidingDrawer
    Android 3.0 r1 API中文文档(105) —— ViewParent
    Android 中文 API (102)—— CursorAdapter
    Android开发者指南(4) —— Application Fundamentals
    Android开发者指南(1) —— Android Debug Bridge(adb)
    Android中文API(115)——AudioFormat
    Android中文API(116)——TableLayout
    Android开发者指南(3) —— Other Tools
    Android中文API (110) —— CursorTreeAdapter
  • 原文地址:https://www.cnblogs.com/mythou/p/3133300.html
Copyright © 2020-2023  润新知