VS2005使用map文件查找程序崩溃原因

一般程序崩溃可以通过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 错误分析相关推荐

  1. Data Abort产生的原因

    首先分析Data Abort产生的原因: 1.一般是与Memory 误操作有关,如对0地址写操作,或对一些Memory 越界操作. 有人总结出以下几点,我后也差不多. 原因有以下几点:1)当debug ...

  2. ARM Linux异常处理之data abort(一)

    本文简要分析了ARM Linux的data abort异常处理过程,内核版本2.6.28,s3c6410平台. 异常向量与程序跳转 data abort是ARM体系定义的异常之一.异常发生时,ARM会 ...

  3. abort linux,ARM Linux异常处理之data abort

    1 异常向量与程序跳转data abort是ARM体系定义的异常之一.异常发生时,ARM会自动跳转到异常向量表中,通过向量表中的跳转命令跳转到相应的异常处理中去. ARM的异常处理向量表在entry- ...

  4. DATA abort定位方法

     这是我一直收藏的一篇文章,出处已经无法知道. 根据自己实践增加了部分说明,现在分享出来. 该方法只能定位 显性 泄漏,定位到的C语句一定产生泄漏了,但可能这个位置是 " 理论上 &qu ...

  5. 解决 uboot data abort报错

    新手解决bug 一步一坑-_-! 一切从最基础的开始 加油 报错内容如下: 536 bytes read in 6 ms (86.9 KiB/s) ** File not found /boot/dt ...

  6. 没有安装提供程序“System.Data.SqlServerCe.3.5”的解决方法

    没有安装提供程序"System.Data.SqlServerCe.3.5"的解决方法 参考文章: (1)没有安装提供程序"System.Data.SqlServerCe. ...

  7. WinCE 应用程序开机自动方法

    近日在开发过程中遇到WinCE应用程序开机自动运行的问题,在网上找了找,发现大概有以下三种方法: 1. 将应用程序和应用程序快捷方式添加到映像里,再将快捷方式添加到StartUp目录下,这样当系统运行 ...

  8. wince 自动启动程序设置

    这是我在做wince6的时候为设置自启动而寻找的方法.我发现公司定的这个设备在"Program Files"和windows文件夹下放置的东西在机子重启之后就什么都没有了.我只有使 ...

  9. u-boot新增命令后出现data abort

    (一)问题描述 u-boot下新增了一条update的命令,直接输入update没有报错,但是输入up按TAB键补全时发现出现data abort,而且输入不支持的命令也会有data abort (二 ...

最新文章

  1. boost::asio使用UDP协议通信源码实现
  2. Python 套接字-判断socket服务端有没有关闭的方法实例演示,查看socket运行状态
  3. VTK:可视化之ProgrammableGlyphFilter
  4. XDOJ-1073-Nunchakus_求一个集合能否分裂成两个和相等的集合(dp、背包问题)
  5. java 两个页面传递数据,请问Cookie怎么在两个页面间传递数据?
  6. shell数组使用技巧
  7. 《计算机网络 自顶向下方法》(第7版)答案(第一章)(一)
  8. mirth connect 去空格
  9. 【百度AI图像识别】LOGO帝来袭~ 个体再小、LOGO不能少
  10. php公众号模板在哪,微信公众号模板哪里找?公众号如何套用模板?
  11. 计算机主机进水无法启动,电脑主机进水会有什么影响!
  12. 完全指南:在 Linux 中如何打印和管理打印机
  13. 三种等待方式:强制等待、显式等待、隐式等待
  14. 十沣科技TF-Dyna不亚于国际主流商业软件 应用领域广泛
  15. 作业调度算法--先来先服务
  16. 模型推荐丨政务大数据项目案例模型分享
  17. JDK8之Optional
  18. DynaBeanHolder动态bean构造器实现
  19. 如何正确对用户密码进行加密?
  20. bit.ly 短地址转换_使用PHP创建Bit.ly短URL

热门文章

  1. UWP DEP0700: 应用程序注册失败。[0x80073CF9] 另一个用户已安装此应用的未打包版本。当前用户无法将该版本替换为打包版本。...
  2. 史上最详细的JNI入门教程HelloNative
  3. tomcat 后台 getshell
  4. android学习中常见问题集锦
  5. linux中用shell获取时间,日期
  6. [导入]在asp.net中实现观察者模式,或有更好的方法(续)
  7. WPF学习笔记5: Xaml之Markup Extensions
  8. Centos 7 密码重置
  9. 把java程序打包成.exe
  10. 进程间通信之-信号signal--linux内核剖析(九)