如何定位WinCE产生Data Abort错误的位置

news/2024/6/29 12:02:42 标签: wince, exception, c, 汇编, 编译器, 工作
cle class="baidu_pl">
cle_content" class="article_content clearfix">
content_views" class="htmledit_views">
class="date"> 2009-07-20 16:40
class="cnt">

在调试WinCE程序的时候࿰c;有时候会碰到Data Abort的异常࿰c;系统会在调试控制台输出如下类似信息:
Exception 'Data Abort' (4): Thread-Id=03d3000e(pth=83a9e024), Proc-Id=00400002(pprc=81d48308) 'NK.EXE', VM-active=00fa000a(pprc=83a20ecc) 'explorer.exe'
PC=c0883660(s3c2440disp.dll+0x00003660) RA=a014f780(???+0xa014f780) SP=d2e8fc58, BVA=00000000

对于按Release编译的程序࿰c;需要一些额外的工作才能找到产生错误的地方࿰c;下面描述了如何根据错误提示信息定位错误代码的过程:

编译器产生map和cod文件
设置WINCEMAP和WINCECOD两个环境变量࿰c;然后重新编译整个项目࿰c;我是在BAT文件中加入这两行代码:
set WINCEMAP=1
set WINCECOD=1

计算错误产生的地址
错误产生在s3c2440disp.dll内部࿰c;打开文本文件s3c2440disp.map(与s3c2440disp.dll在同一目录)࿰c;在文件头中࿰c;"Preferred load address is 10000000"指出Rav地址为0x10000000࿰c;将其与错误产生的偏移地址0x00003660相加࿰c;得到Rva+Base地址为0x10003660(0x10000000 + 0x00003660)

找出错误来自哪个文件哪个函数
在s3c2440disp.map文件中࿰c;根据Rva+Base地址࿰c;得知错误产生于s3c2440disp.obj中的S3C2440DISP::CursorOff成员函数内部
0001:00002274       ?CursorOn@S3C2440DISP@@QAAXXZ 10003274 f   s3c2440disp.obj
0001:00002578       ?CursorOff@S3C2440DISP@@QAAXXZ 10003578 f   s3c2440disp.obj
0001:000026f4       ?SetPointerShape@S3C2440DISP@@UAAJPAVGPESurf@@0HHHH@Z 100036f4 f   s3c2440disp.obj

计算错误在函数中的偏移地址
CursorOff函数起始地址为0x10003578࿰c;错误指令在代码中的偏移为0xE8 (0x10003660 - 0x10003578)

找到错误出自哪行代码
打开文件s3c2440disp.cod文件(与s3c2440disp.obj在同一目录)࿰c;定位到CursorOff函数偏移0xE8处(0x10003660 - 0x10003578, 错误地址-函数开始地址)࿰c;即可找到了错误发生的汇编代码和对应的C源代码
; 624 :     {
; 625 :      break;
; 626 :     }
; 627 :
; 628 :     ptrLine[x * (m_colorDepth >> 3)] = cbsLine[(x - m_CursorRect.left) * (m_colorDepth >> 3)];

000d0 e59430c0 ldr         r3, [r4, #0xC0]
000d4 e59420e4 ldr         r2, [r4, #0xE4]
000d8 e1a001a3 mov         r0, r3, lsr #3
000dc e0463002 sub         r3, r6, r2
000e0 e0227093 mla         r2, r3, r0, r7
000e4 e021e690 mla         r1, r0, r6, lr
000e8 e5d23000 ldrb        r3, [r2]
000ec e5c13000 strb        r3, [r1]

(错误行的汇编代码表明CPU在读入cbsLine指针指向的数据时发生了异常࿰c;经过调试࿰c;最终得知错误产生是因为某些情况下cbsLine指针无效而导致Data Abort异常)


本文来自CSDN博客࿰c;转载请标明出处:http://blog.csdn.net/noodies/archive/2009/07/02/4315948.aspx

cle>

http://www.niftyadmin.cn/n/1516607.html

相关文章

python 生成图片_网站验证码的生成原理、难度控制,及Python实现!

图片验证码已经广泛的使用在各种反爬虫的场景中,验证码的的生成验证过程对于开发者来说是零成本的,对于用户体验来说可能稍差、但是对于爬虫来说是致命的和高成本的。下面将介绍使用python实现网站验证码的产生及验证的全过程,然我们对验证码…

深入理解.bin文件和.nb0文件的结构

http://blog.sina.com.cn/s/blog_455851af0100d9gi.html .bin文件是一个描述性质的映像文件,它由文件头(head)、镜像数据目的起始地址(ImageStart)、镜像数据长度(ImageLength)和多条相对独立的记录(record)构成。文件头(head)由7个字节组成&…

python顺序查找排序_查找和排序算法的python代码

一&#xff0e;查找算法&#xff1a;1.顺序查找&#xff1a;普通程序&#xff1a;def sequefind(l,x):k0while k<len(l)-1 and x!l[k]:kk1if k>len(l)-1:return 0else:return ks[2,6,7,3,9,98]while(1):keyint(input("待查找的数是:"))nsequefind(s,key)if n0:…

gpio介绍

General Purpose Input OutputGPIO (通用输入/输出)或总线扩展器利用工业标准I2C、SMBus™或SPI™接口简化了I/O口的扩展。当微控制器或芯片组没有足够的I/O端口&#xff0c;或当系统需要采用远端串行通信或控制时&#xff0c;GPIO产品能够提供额外的控制和监视功能。 每个GPIO…

python windows下载 linux装_python3的安装,Window与linux

一、window安装1.首先是window下的安装。进入python网站https://www.python.org/downloads/下载页面&#xff0c;选择所需要的版本进行下载。点击Download&#xff0c;进入页面&#xff0c;拉到最下面&#xff0c;有个File的标题选择你需要的进行下载&#xff0c;箭头所指的是&…

python条形图的动画显示水能时钟_水波动画背景的时钟界面

CSS语言&#xff1a;CSSSCSS确定html,body {height: 100%;}html {background: #00BCD4;overflow: hidden;}body {display: -webkit-box;display: -webkit-flex;display: -ms-flexbox;display: flex;-webkit-box-pack: center;-webkit-justify-content: center;-ms-flex-pack: c…

python索引序列_Python for循环通过序列索引迭代过程解析

这篇文章主要介绍了Python for循环通过序列索引迭代过程解析,文中通过示例代码介绍的非常详细&#xff0c;对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下Python for 循环通过序列索引迭代&#xff1a;注&#xff1a;集合 和 字典 不可以通过索引进行获取元…

python legb_python函数作用域LEGB

我们的在学习Python函数的时候&#xff0c;经常会遇到很多定义域的问题&#xff0c;全部变量&#xff0c;内部变量&#xff0c;内部嵌入的函数&#xff0c;等等&#xff0c;Python是如何查找的呢&#xff1f;以及Python又是按照什么顺序来查找的呢&#xff1f;这里做一个顺序的…