WinCE应用程序产生Data Abort 错误分析
一般程序崩溃可以通过debug,找到程序在那一行代码崩溃了,最近编一个多线程的程序,都不知道在那发生错误,多线程并发,又不好单行调试,终于 找到一个比较好的方法来找原因,通过生成map文件,由于2005取消map文件生成行号信息(vc6.0下是可以生成行号信息的,不知道 microsoft怎么想的,在2005上取消了),只能定位在那个函数发生崩溃。这里可以通过生成cod文件,即机器码这一文件,具体定位在那一行崩 溃。
首先配置vc2005生成map文件和cod文件:(1).map文件:property->Configuration Properties->Linker->Debugging 中的Generate Map File选择Yes(/MAP);
(2).cod文件:property->Configuration Properties->C/C++->output Files中Assembler OutPut中选择Assembly,Maching Code and Source(/FAcs),生成机器,源代码。
简单例子:
(1) #include "stdafx.h"
void errorFun(int * p)
{
*p=1;
}
int _tmain(int argc, _TCHAR* argv[])
{
int * p=NULL;
errorFun(p);
return 0;
}
在errorFun中函数中,*p=1这一行出错,由于p没有申请空间,运行时出错,弹出
Unhandled exception at 0x004113b1 in testError.exe: 0xC0000005: Access violation writing location 0x00000000.
在0x004113b1程序发生崩溃。
(2)debug文件下打开map文件,定位崩溃函数.
map文件开头是一些链接信息,然后我们要找函数和实始地址信息。地址是函始的开始地址
Address Publics by Value Rva+Base Lib:Object
0000:00000000 ___safe_se_handler_count 00000000 <absolute>
0000:00000000 ___safe_se_handler_table 00000000 <absolute>
0000:00000000 ___ImageBase 00400000 <linker-defined>
0001:00000000 __enc$textbss$begin 00401000 <linker-defined>
0001:00010000 __enc$textbss$end 00411000 <linker-defined>
0002:00000390 ?errorFun@@YAXPAH@Z 00411390 f testError.obj
0002:000003d0 _wmain 004113d0 f testError.obj
0002:00000430 __RTC_InitBase 00411430 f MSVCRTD:init.obj
0002:00000470 __RTC_Shutdown 00411470 f MSVCRTD:init.obj
0002:00000490 __RTC_CheckEsp 00411490 f MSVCRTD:stack.obj
0002:000004c0 @_RTC_CheckStackVars@8 004114c0 f MSVCRTD:stack.obj
0002:00000540 @_RTC_AllocaHelper@12 00411540 f MSVCRTD:stack.obj
....
程序崩溃地址0x004113b1,我们找到第一个比这个地址大的004113d0,前一个是00411390,地址是函数的开始地址,所以发生的崩溃的的函数是errorFun,这个函数的初始地址00411390.
(3)找出具体崩溃行号.
由(2)可知,发生错误函数是errorFun,在testError.obj,打开testError.cod文件,找到errorFun函数生成的机器码.
?errorFun@@YAXPAH@Z PROC ; errorFun, COMDAT
; 7 : {
00000 55 push ebp
00001 8b ec mov ebp, esp
00003 81 ec c0 00 00
00 sub esp, 192 ; 000000c0H
00009 53 push ebx
0000a 56 push esi
0000b 57 push edi
0000c 8d bd 40 ff ff
ff lea edi, DWORD PTR [ebp-192]
00012 b9 30 00 00 00 mov ecx, 48 ; 00000030H
00017 b8 cc cc cc cc mov eax, -858993460 ; ccccccccH
0001c f3 ab rep stosd
; 8 : *p=1;
0001e 8b 45 08 mov eax, DWORD PTR _p$[ebp]
00021 c7 00 01 00 00
00 mov DWORD PTR [eax], 1
; 9 : }
00027 5f pop edi
00028 5e pop esi
00029 5b pop ebx
0002a 8b e5 mov esp, ebp
0002c 5d pop ebp
0002d c3 ret 0
(说明: 7,8,9是表示在源代码的行号。
00000 55 push ebp,000000是相对偏移地地,55是机器码号,push ebp,000000是汇编码。)
通过(2)我们计算相对偏移地址,即崩溃地址-函数起始地址,0x004113b1-0x00411390=0x21(16进制的计数)
找到0x21这一行对应的机器码是 00021 c7 00 01 00 00,向上看它是由第8行*p=1;生成的汇编码,由此可见是这一行程序发生崩溃。
结束语:当然这只是一个简单的例子,实际上一运行便知道是这一行出错,但是对于一个比较大的工程,特别是在多线程并发情况下,要找出那一行出错比较困难,便可以使用map和cod文件找到程序崩溃原因。
转载于:https://blog.51cto.com/williamnw/1403903
WinCE应用程序产生Data Abort 错误分析相关推荐
- Data Abort产生的原因
首先分析Data Abort产生的原因: 1.一般是与Memory 误操作有关,如对0地址写操作,或对一些Memory 越界操作. 有人总结出以下几点,我后也差不多. 原因有以下几点:1)当debug ...
- ARM Linux异常处理之data abort(一)
本文简要分析了ARM Linux的data abort异常处理过程,内核版本2.6.28,s3c6410平台. 异常向量与程序跳转 data abort是ARM体系定义的异常之一.异常发生时,ARM会 ...
- abort linux,ARM Linux异常处理之data abort
1 异常向量与程序跳转data abort是ARM体系定义的异常之一.异常发生时,ARM会自动跳转到异常向量表中,通过向量表中的跳转命令跳转到相应的异常处理中去. ARM的异常处理向量表在entry- ...
- DATA abort定位方法
这是我一直收藏的一篇文章,出处已经无法知道. 根据自己实践增加了部分说明,现在分享出来. 该方法只能定位 显性 泄漏,定位到的C语句一定产生泄漏了,但可能这个位置是 " 理论上 &qu ...
- 解决 uboot data abort报错
新手解决bug 一步一坑-_-! 一切从最基础的开始 加油 报错内容如下: 536 bytes read in 6 ms (86.9 KiB/s) ** File not found /boot/dt ...
- 没有安装提供程序“System.Data.SqlServerCe.3.5”的解决方法
没有安装提供程序"System.Data.SqlServerCe.3.5"的解决方法 参考文章: (1)没有安装提供程序"System.Data.SqlServerCe. ...
- WinCE 应用程序开机自动方法
近日在开发过程中遇到WinCE应用程序开机自动运行的问题,在网上找了找,发现大概有以下三种方法: 1. 将应用程序和应用程序快捷方式添加到映像里,再将快捷方式添加到StartUp目录下,这样当系统运行 ...
- wince 自动启动程序设置
这是我在做wince6的时候为设置自启动而寻找的方法.我发现公司定的这个设备在"Program Files"和windows文件夹下放置的东西在机子重启之后就什么都没有了.我只有使 ...
- u-boot新增命令后出现data abort
(一)问题描述 u-boot下新增了一条update的命令,直接输入update没有报错,但是输入up按TAB键补全时发现出现data abort,而且输入不支持的命令也会有data abort (二 ...
最新文章
- boost::asio使用UDP协议通信源码实现
- Python 套接字-判断socket服务端有没有关闭的方法实例演示,查看socket运行状态
- VTK:可视化之ProgrammableGlyphFilter
- XDOJ-1073-Nunchakus_求一个集合能否分裂成两个和相等的集合(dp、背包问题)
- java 两个页面传递数据,请问Cookie怎么在两个页面间传递数据?
- shell数组使用技巧
- 《计算机网络 自顶向下方法》(第7版)答案(第一章)(一)
- mirth connect 去空格
- 【百度AI图像识别】LOGO帝来袭~ 个体再小、LOGO不能少
- php公众号模板在哪,微信公众号模板哪里找?公众号如何套用模板?
- 计算机主机进水无法启动,电脑主机进水会有什么影响!
- 完全指南:在 Linux 中如何打印和管理打印机
- 三种等待方式:强制等待、显式等待、隐式等待
- 十沣科技TF-Dyna不亚于国际主流商业软件 应用领域广泛
- 作业调度算法--先来先服务
- 模型推荐丨政务大数据项目案例模型分享
- JDK8之Optional
- DynaBeanHolder动态bean构造器实现
- 如何正确对用户密码进行加密?
- bit.ly 短地址转换_使用PHP创建Bit.ly短URL
热门文章
- UWP DEP0700: 应用程序注册失败。[0x80073CF9] 另一个用户已安装此应用的未打包版本。当前用户无法将该版本替换为打包版本。...
- 史上最详细的JNI入门教程HelloNative
- tomcat 后台 getshell
- android学习中常见问题集锦
- linux中用shell获取时间,日期
- [导入]在asp.net中实现观察者模式,或有更好的方法(续)
- WPF学习笔记5: Xaml之Markup Extensions
- Centos 7 密码重置
- 把java程序打包成.exe
- 进程间通信之-信号signal--linux内核剖析(九)