zoukankan      html  css  js  c++  java
  • 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%有效。有时候遇到一些异常是来自库文件就比较麻烦。

  • 相关阅读:
    java算法--循环队列
    java算法--普通队列
    java算法--稀疏数组
    HelloWorld
    css
    自定义事件并且主动触发
    数组字符串操作
    进阶路上有你我-相互相持篇之ES6里箭头函数里的this指向问题
    关于一道面试题
    异步函数回调
  • 原文地址:https://www.cnblogs.com/mythou/p/3133300.html
Copyright © 2011-2022 走看看