分析堆栈,处理异常
来源:互联网 发布:硬盘数据销毁软件 编辑:程序博客网 时间:2024/05/17 01:57
相信很多程序员头疼的是软件在家里测试没有问题,拿给客户后莫名其妙出现异常,而客户又描述不清楚,然后跑去现场调试,跟踪半天又重现不了问题。有一种方法可以精确定位异常代码,就是查找堆栈表。
本文只针对WINDOWS平台软件,当软件发生异常时,会弹出“遇到问题需要关闭,要查看这个错误报告包含的数据,请单击此处”,点击之后弹出一些详细信息,下面就来讲一下如何根据Offset来跟踪异常代码。
首先,在工程中
设置Listing Files->Listing file type->Assembly, Machine Code, and Source,
再勾选Generate map file
这样每次编译都会生成map文件以及相应模块的cod文件。
当软件发布后,请保留这些堆栈表,用于跟踪错误代码。
然后,当软件发生错误,查看到Offset值,
例如:Offset: 00001469,
先打开map文件,找到与该地址最相近又不大于值的,
例如:?OnButton1@CZzzzDlg@@IAEXXZ 00401450 f zzzzDlg.obj,
(注意头4位0040是Preferred load address is 00400000)
可以得知错误发生在zzzzDlg对象的OnButton1函数中,
然后计算出代码偏移位置:00001469-00401450=19(十六进制),
打开zzzzDlg.cod找到OnButton1对应代码处,
例如:
; 181 : char* p = NULL;
; 182 :
; 183 : char* abc = new char[20];
00002 6a 14 push 20 ; 00000014H
00004 33 ff xor edi, edi
00006 e8 00 00 00 00 call ??2@YAPAXI@Z ; operator new
0000b 8b f0 mov esi, eax
0000d 83 c4 04 add esp, 4
; 184 :
; 185 : for (a = 0; a < 20; a++)
00010 33 c0 xor eax, eax
; 186 : {
; 187 : abc[a] = a;
; 188 :
; 189 : p[a] = 1;
00012 33 d2 xor edx, edx
00014 b9 01 01 01 01 mov ecx, 16843009 ; 01010101H
00019 89 0a mov DWORD PTR [edx], ec <-------------就是这一行
对应代码p[1]=1(错误就是这一句)
现在我们来分析一下代码
char* p = NULL; (p为空指针)
p[a]=1; (往空指针内写数据, 肯定会异常)
不对的地方欢迎大家批评指正
本文只针对WINDOWS平台软件,当软件发生异常时,会弹出“遇到问题需要关闭,要查看这个错误报告包含的数据,请单击此处”,点击之后弹出一些详细信息,下面就来讲一下如何根据Offset来跟踪异常代码。
首先,在工程中
设置Listing Files->Listing file type->Assembly, Machine Code, and Source,
再勾选Generate map file
这样每次编译都会生成map文件以及相应模块的cod文件。
当软件发布后,请保留这些堆栈表,用于跟踪错误代码。
然后,当软件发生错误,查看到Offset值,
例如:Offset: 00001469,
先打开map文件,找到与该地址最相近又不大于值的,
例如:?OnButton1@CZzzzDlg@@IAEXXZ 00401450 f zzzzDlg.obj,
(注意头4位0040是Preferred load address is 00400000)
可以得知错误发生在zzzzDlg对象的OnButton1函数中,
然后计算出代码偏移位置:00001469-00401450=19(十六进制),
打开zzzzDlg.cod找到OnButton1对应代码处,
例如:
; 181 : char* p = NULL;
; 182 :
; 183 : char* abc = new char[20];
00002 6a 14 push 20 ; 00000014H
00004 33 ff xor edi, edi
00006 e8 00 00 00 00 call ??2@YAPAXI@Z ; operator new
0000b 8b f0 mov esi, eax
0000d 83 c4 04 add esp, 4
; 184 :
; 185 : for (a = 0; a < 20; a++)
00010 33 c0 xor eax, eax
; 186 : {
; 187 : abc[a] = a;
; 188 :
; 189 : p[a] = 1;
00012 33 d2 xor edx, edx
00014 b9 01 01 01 01 mov ecx, 16843009 ; 01010101H
00019 89 0a mov DWORD PTR [edx], ec <-------------就是这一行
对应代码p[1]=1(错误就是这一句)
现在我们来分析一下代码
char* p = NULL; (p为空指针)
p[a]=1; (往空指针内写数据, 肯定会异常)
不对的地方欢迎大家批评指正
- 分析堆栈,处理异常
- 分析android异常时的堆栈信息
- Hard Fault 异常错误堆栈分析
- java 异常处理分析
- 异常处理案例分析
- 异常堆栈
- 异常处理 续之(堆栈解退、auto_ptr)
- C++异常处理及函数堆栈信息打印
- [c++基础] 内存,堆栈,资源,异常处理相关问题
- Java-快速排序,java.lang.StackOverflowError堆栈溢出异常处理
- python错误处理记录完整的异常堆栈信息
- Java异常机制及异常处理分析
- 通过JVM堆栈分析线程出现大量异常的原因
- Linux内核分析-异常处理
- 【题目】C++异常处理分析
- FreeRTOS源码分析-异常处理
- tiny6410异常处理例程分析
- 异常常见类型处理分析
- 让RadioButtonList 像Tab菜单控件一样显示
- stl容器区别: vector list deque set map及底层实现
- C#在Form上面画一把尺子
- java.lang.UnsupportedClassVersionError: Bad version number in .class file异常
- Linux/Fedora15安装Apache + MySQL + PHP
- 分析堆栈,处理异常
- 正则表达式由浅入深
- linux 制作logo的方法
- one or more constraints have not been satisfied
- 主流报表制作工具之王者争夺战:功能大PK系列之树状报表展现
- Delphi
- Java compiler level does not match the version of the installed Java project facet.
- Div层被嵌入的Flash层遮盖问题解决思路
- Oracle 内存结构 :SGA PGA