赞
踩
基本步骤:
查看WINDOWS事件日志,收集应用错误信息。
准备windbg环境。
定位代码位置。
打开WINDOWS事件日志--“应用程序”类目,找到对应程序的错误日志。
如下图所示:
得到以下有用信息:
1.异常代码: 0xc0000005。指示什么错误类型,这个代码值一般是非法指针。
2.错误偏移量: 0x0000100d。模块的代码位置。
3.错误应用程序路径: xxxxxxxxxxx\testdbg\output\testdbg.exe 崩溃的进程。
4.错误模块路径: xxxxxxxxxxx\testdbg\output\mydll3.dll。进程所加载DLL。
注意,第4点,一定要是自己编译的模块,并且有编译时候的PDB文件,才有意义。
假如崩溃在系统DLL或第三方DLL,则没有办法指定代码位置。
启动windbg。
配置windbg的PDB文件路径,必须要日志提示的exe和dll对应的pdb文件。
通过windbg启动该exe。
找到错误模块mydll3.dll的内存地址。
如下图,mydll3.dll模块开始地址是(十六进制):0x7b550000
计算错误代码地址
经过前面收集资料,得到如下信息:
模块开始位置:0x7b550000
错误偏移量:0x0000100d
错误代码位置=模块开始位置+错误偏移=0x7b550000+0x0000100d=0x7b55100d
查看错误地址代码
查看地址代码命令: ln addr
其中addr是十六进制地址,带不带前缀0x都可以。。
前面我们已经得到错误代码地址是0x7b55100d,
则输入命令:ln 7b55100d
如下图所示。
可以看到代码位置是mydll3.cpp(34),即在34行代码。
34行代码,如下图所示。
因是通过全局变量定义类ctmp的对象,所以,代码28行构造函数会被调用。从而20、21行代码执行,非法指针操作导致崩溃。
为什么定位到34,而不是21行?因为编译器优化后的结果,34行位置记录了构造函数信息。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。