很大可能,在用户现场的时候,可能存在崩溃了但是没有生成dump的情况,可能只能有一些系统日志或者直接给你个截图什么的分析。那这种情况应该怎么分析呢?
#include "stdafx.h"
void Test()
{
std::cout << "this is test!" <<std::endl;
char* pTest = NULL;
*pTest = '1';
}
int _tmain(int argc, _TCHAR* argv[])
{
Test();
system("pause");
return 0;
}
1、系统日志的错误信息
首先我们可以看一下系统日志(控制面板\系统和安全\查看事件日志),打开事件查看器——windows日志——应用程序,根据崩溃的进程找到对应的错误日志
在常规页,我们可以知道以下信息:
错误应用程序名称以及版本
错误模块名称以及版本
异常代码
错误偏移量
错误进程ID
错误应用程序启动时间
错误应用程序路径
错误模块路径
报告ID
错误程序包全名
错误程序包相对应用程序ID
在这里,错误模块名称以及版本、错误偏移量对我们的分析起关键作用。
2、分析崩溃
1、获取exe和pdb
在第1步中我们知道了崩溃的模块以及模块的版本(测试用的,只有本地一个,因此不存在查找之类的操作),接着去取对应的exe和pdb放在同一个目录下
2、ide打开对应exe
打开exe时,选择使用PE,点击OK按钮
若弹出确认框,选择yes
菜单栏——打开——选择对应的exe文件——打开
3、找基址
工具栏Edit——Segments——Rebase program…,如下
说明基址是:0x400000
4、查找错误位置
目前的代码显示的是汇编的,我们可以在IDA点击热键F5切换成C代码,如下
从上面,我们知道基址是0x400000,错误偏移量是 0x0000102c,因此计算一下:
0x400000 + 0x0000102c = 0x40102c
接下来我们跳转到这个地址,按‘G’,在弹出的地址栏中输入该值
得到
光标定位在该行,通过查看源代码,发现是这里有问题
这样我们就可以得到一个猜测的方向了