(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. 假设异常偏移地址: 0x0001152f
计算异常的绝对地址
打开程序的map文件, 找到类似下行
Preferred load address is 00400000
00400000 是程序的基地址
异常的绝对地址为: 0x00400000+0x1152f=0x0041152f
2. 定位异常发生所在的函数, 打开map 文件
找到第一个接近0x0041152f,但小于0x0041152f的值,因为异常如果发生在某个函数中时,异常地址0x0041152f肯定高于函数的起始地址
所要找的列为Rva+Base,可以看出004114d0复合要求,那么异常就是发生在Test函数中
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:000004d0 ?Test@@YAXXZ 004114d0 f DumpTest1.obj
0002:00000570 _wmain 00411570 f DumpTest1.obj
3. 打开.cod文件,找到函数
?Test@@YAXXZ PROC ; Test, COMDAT
; 17 : {
00000 55 push ebp
00001 8b ec mov ebp, esp
00003 81 ec cc 00 00
00 sub esp, 204 ; 000000ccH
00009 53 push ebx
0000a 56 push esi
0000b 57 push edi
0000c 8d bd 34 ff ff
ff lea edi, DWORD PTR [ebp-204]
00012 b9 33 00 00 00 mov ecx, 51 ; 00000033H
00017 b8 cc cc cc cc mov eax, -858993460 ; ccccccccH
0001c f3 ab rep stosd
; 18 : st *temp = (st *)malloc(sizeof(st));
第一行
其中"0000"表示相对于函数开始地址后的偏移,在debug版本中,这个数据为相对于函数起始地址的偏移(此时每个函数第一条语句相对偏移为0000);release版本中为相对于代码段第一条语句的偏移(即代码段第一条语句相对偏移为0000,而以后的每个函数第一条语句相对偏移就不为0000了)
"55"为编译后的机器代码," push ebp"为汇编代码。
从"cod"文件中我们可以看出,一条(c/c++)语句通常需要编译成数条汇编语句 。
此外有些汇编语句太长则会分两行显示如:
4. 确定错误的代码行
计算异常行的地址 = 异常绝对地址--函数起始地址==0x0041152f--00x004114d0==5f
异常发生在相对于函数首地址偏移5f的位置
; 23 :
; 24 : temp->age = 30;
0005c 8b 45 f8 mov eax, DWORD PTR _temp$[ebp]
0005f c7 40 0c 1e 00
00 00 mov DWORD PTR [eax+12], 30 ; 0000001eH
5. 只有崩溃的决定地址,找出Release版的奔溃处
对于release版的程序,如果崩溃的话,我查找对应源代码的办法是:
首先记下程序崩溃的地址,这个程序崩溃时windows会提示0X.......。
然后,把源程序加上 /FAcs 选项再重新编译一下,加上该选项可以生成一个源代码、汇编代码、机器码都含有的文件。
然后,用olydlg之类的反汇编软件找到崩溃地址对应的汇编代码和机器码,
用UE之类的文本编辑软件打开含有源代码、汇编代码、机器码都含有的文件,用搜索功能查找反汇编软件中崩溃地址附近的机器码也就是十六进制数,很快就可以找到位置了。
一般我几分钟就可以定位。
使用的人只要把崩溃地址告诉我,我就可以修改程序了。
分享到:
相关推荐
例如,如果崩溃地址为`0x0040104a`,则需要在MAP文件中找到包含这个地址的段,并进一步确定其对应的源代码行。 #### 实例解析 以下是一个具体的示例: 假设程序崩溃时给出了内存地址`0x0040104a`,根据上文提到的...
在cod文件中找到地址0x00021附近的行,即为崩溃发生的源代码行。 #### 五、总结 通过以上步骤,我们可以有效地利用VS中的Map文件和Cod文件来定位程序崩溃的原因和具体位置。这种方法不仅可以提高问题诊断的速度,...
### FineReport常见数据集报错错误代码与解释 在日常工作中使用FineReport进行报表开发时,难免会遇到各种各样的错误提示。理解这些错误代码及其含义对于快速定位问题、解决问题至关重要。下面,我们将详细介绍一...
理解如何将这些地址解析到具体的代码行,可以帮助我们快速诊断和修复错误,提高应用的稳定性。本文将深入探讨iOS崩溃地址解析的过程。 首先,我们需要了解崩溃日志的基本结构。当iOS应用崩溃时,系统会生成一个称为...
在C++开发中,尤其是当应用涉及到Android NDK(Native Development Kit)时,有时程序崩溃并不会直接指出哪一行代码导致了错误。此时,开发者需要通过分析堆栈跟踪(backtrace)中的内存地址来定位问题所在。`addr2...
- 在错误报告中记录下程序崩溃的确切地址。例如:0x426502。 **2. 查找MAP文件中的对应地址** - 打开程序对应的MAP文件,找到 "Rva + Base" 项下与崩溃地址最接近的地址。例如:004264c0。 - 查看该地址对应的函数...
【标题】:“让VS2005瞬间崩溃的几句代码”揭示了编程中可能遇到的错误处理和调试问题。Visual Studio 2005(VS2005)是一款广泛使用的开发环境,主要针对C#等.NET Framework语言进行程序设计。在编写自定义控件时,...
当出现这个错误代码时,系统可能会出现崩溃、蓝屏、无法启动等问题。 知识点2: 如何解决错误代码0x80004005 解决错误代码0x80004005的方法有多种,以下是其中的一些: * 方法1: 使用注册表项修复工具 * 方法2: ...
错误代码是操作系统在崩溃时为了帮助开发者和用户识别问题而提供的关键信息。例如,“0x0000007B”通常表示硬盘配置错误,而“0x0000008E”可能是因为系统进程遇到错误或者内存管理问题。 文档中的“蓝屏常见错误...
当电脑出现蓝屏时,屏幕上会显示一个错误代码,这对于诊断问题的原因至关重要。本篇将详细解释如何理解和解决Windows蓝屏错误代码。 1. **错误代码的含义** Windows蓝屏错误代码通常由四个部分组成:一个前缀...
根据提供的信息,我们可以了解到这是一份关于V3700命令行界面的信息文档,主要包含了大量与V3700设备相关的错误代码及其编号。为了更好地理解和应用这些信息,我们将逐一解析部分重要的错误代码,解释它们的意义、...
分析JVM崩溃日志时,重点是定位问题所在的代码行,了解触发错误的操作,以及查看是否有内存管理问题,如堆溢出或栈溢出。同时,还要检查堆栈跟踪,确定哪些线程或方法在崩溃时刻正在执行,并结合Java堆、方法区、元...
解决此类问题,我们需要根据错误代码查阅官方文档或在线资源,以确定可能的原因,如驱动不兼容、硬件故障、系统文件损坏等,并采取相应的修复措施。 2. **WINDOWS系统文件详解**:Windows系统文件是操作系统正常...
4. **结合代码审查**:将堆栈回溯与代码对比,理解每个调用的上下文,确定可能导致崩溃的代码行。 5. **复现问题**:如果提供了足够的用户信息,尝试在相同环境下运行应用,重现崩溃情况。 6. **修复和测试**:修复...
在Windows操作系统中,"蓝屏"(Blue Screen of Death,简称BSOD)是系统遇到严重错误...通过提供的错误代码说明一览表,用户可以更有效地定位问题,采取相应措施修复系统,从而避免或减少不必要的数据损失和系统崩溃。
WinDbg是一款强大的调试工具,由Microsoft开发,用于诊断和解决各种应用程序的问题,包括内存泄漏、线程同步错误、异常处理等。本文将深入探讨如何使用WinDbg进行程序崩溃的调试,并提供针对C++和.NET平台的调试策略...
1. **内核模式下的异常触发**:当运行在内核模式下的设备驱动程序或操作系统函数引发了一个未被处理的异常时,例如内存访问违规,即尝试写入只读页面或访问当前未映射的地址,这会导致系统崩溃。 2. **内核支持...