在VC中如何找到崩溃的源头(二)
来源:互联网 发布:识图的软件 编辑:程序博客网 时间:2024/05/29 17:32
通过“crash地址 + MAP文件”来定位出错代码位置虽然需要经过比较复杂的地址计算,但却是最简单实现的方式。如果仅仅想通过崩溃地址定位出错的函数,就更加方便了。我在网上找到一个解析MAP文件的小工具,可以非常清晰的列出每个函数的地址,并且可以将分析表格导出为Excel文件。工具下载地址:http://e.ys168.com/?tinyfun,工具目录下VCMapper.exe。
另外上篇主要参考两篇文章:
http://www.vckbase.com/document/viewdoc/?id=908
http://www.vckbase.com/document/viewdoc/?id=1473
方案二:崩溃地址 + MAP文件 + COD文件
由于VC8以后的版本都不再支持MAP文件中产生代码行信息,因此我们寻找另一种定位方式:COD文件。
1、COD文件
COD文件是一个包含了汇编码、二进制机器码和源代码对应信息的文件,每一个cpp都对应一个COD文件。通过这个文件,我们可以非常方便地进行定位。
在VC6中生成COD文件的设置方式为:Project Settings -> C/C++,在 Category 中选 Listing Files,在 Listing file type 组合框中选 Assembly,Machine code,and source。在VC8中生成COD文件的设置方式为:Project Properties -> C/C++ -> Output Files -> Assembler Output 项,选择 Assembly,Machine code,and Source(/Facs)。
2、定位崩溃行
下面通过举例进行说明。现在我有一个基于对话框的MFC应用程序CrashTest,在CCrashTestDlg::OnInitDialog函数中写入导致crash的代码语句(第99行),源文件如下:
总结一下定位步骤:
1) 根据公式 崩溃语句在函数中偏移地址 = 崩溃地址 - 崩溃函数地址 计算出偏移量X;
2) 根据公式 崩溃语句在COD文件中地址 = 崩溃函数在COD文件中地址 + X 计算出地址Y。其中崩溃函数在COD文件中地址为COD文件中函数起始括号“{”后面表明的地址,一般情况下为0x0000;
3) 根据Y在COD文件中找到对应代码行。
ok,方案二介绍完了。这种方法最大的好处是没有VC开发环境版本限制,而且COD文件里面包含的信息更加丰富,不但可以帮助我们定位crash,还能帮我们分析很多东西。当然,这也导致编译生成了很多信息文件。
另外上篇主要参考两篇文章:
http://www.vckbase.com/document/viewdoc/?id=908
http://www.vckbase.com/document/viewdoc/?id=1473
方案二:崩溃地址 + MAP文件 + COD文件
由于VC8以后的版本都不再支持MAP文件中产生代码行信息,因此我们寻找另一种定位方式:COD文件。
1、COD文件
COD文件是一个包含了汇编码、二进制机器码和源代码对应信息的文件,每一个cpp都对应一个COD文件。通过这个文件,我们可以非常方便地进行定位。
在VC6中生成COD文件的设置方式为:Project Settings -> C/C++,在 Category 中选 Listing Files,在 Listing file type 组合框中选 Assembly,Machine code,and source。在VC8中生成COD文件的设置方式为:Project Properties -> C/C++ -> Output Files -> Assembler Output 项,选择 Assembly,Machine code,and Source(/Facs)。
2、定位崩溃行
下面通过举例进行说明。现在我有一个基于对话框的MFC应用程序CrashTest,在CCrashTestDlg::OnInitDialog函数中写入导致crash的代码语句(第99行),源文件如下:
总结一下定位步骤:
1) 根据公式 崩溃语句在函数中偏移地址 = 崩溃地址 - 崩溃函数地址 计算出偏移量X;
2) 根据公式 崩溃语句在COD文件中地址 = 崩溃函数在COD文件中地址 + X 计算出地址Y。其中崩溃函数在COD文件中地址为COD文件中函数起始括号“{”后面表明的地址,一般情况下为0x0000;
3) 根据Y在COD文件中找到对应代码行。
ok,方案二介绍完了。这种方法最大的好处是没有VC开发环境版本限制,而且COD文件里面包含的信息更加丰富,不但可以帮助我们定位crash,还能帮我们分析很多东西。当然,这也导致编译生成了很多信息文件。
0 0
- 在VC中如何找到崩溃的源头(二)
- 在VC中如何找到崩溃的源头(二)
- 在VC中如何找到崩溃的源头
- 在VC中如何找到崩溃的源头
- 找到知识的源头
- 垃圾短信的源头找到了该如何办?
- 使用Map文件查找程序崩溃的源头
- 如何通过崩溃地址找到出错的代码行(ZT)
- 如何通过崩溃地址找到出错的代码行
- 如何通过崩溃地址找到出错的代码行
- 如何使用MAP文件找到程序崩溃的原因
- 如何通过崩溃地址找到出错的代码行
- 如何通过崩溃地址找到出错的代码行(ZT)
- 如何通过崩溃地址找到出错的代码行
- 如何通过map文件轻松找到崩溃的代码行
- 如何通过崩溃地址找到出错的代码行
- 如何通过崩溃地址找到出错的代码行
- 如何通过map文件轻松找到崩溃的代码行
- unity 有限状态机使用
- 在O(1)时间删除链表结点
- Android Studio快捷键汇总(Mac)
- 借款人想通过Netaji货币还款
- GCD定时器
- 在VC中如何找到崩溃的源头(二)
- 修复/lib/ld-linux.so.2: bad ELF interpreter: No such file or directory问题
- 七大排序算法
- AR增强现实功能,也能玩转智能家居?
- WebView设置文本内容字体的大小以及颜色
- 相机中白平衡的算法模拟实现
- 八大排序之选择排序
- Android学习笔记十二:Calendar(示例、出错代码、参数)
- 如何查看 JAR 包的源代码