实现步骤:
1、从客户那里得到崩溃程序偏移地址
异常问题详细描述里面——> 异常偏移: 0x00001028
2、查看文件(exe或者dll)的PE格式,得到PE信息(PE查看工具)
优先装载地址: 0x00400000 和 段对齐大小:0x00001000
主要就这2个信息。
3、根据得到的PE信息,到MAP文件里面去找函数地址(相近地址选择)
查找地址: Rva+Base 下面的
偏移地址+优先装载地址 = 异常地址
0x00001028+ 0x00400000 = 0x00401028(异常地址)
查找异常地址所在函数(Rva+Base)中,挨着大于异常地址,但是又小于异常地址那个地址即为函数地址。
例:
Address Publics by Value Rva+Base Lib:Object
............
0001:00000000 ?Crash@@YAHXZ 00401000 f TestDump.obj
0001:00000040 _main 00401040 f TestDump.obj
............
得到函数 Crash.
4、得到函数地址,去cod文件里面找汇编代码
汇编代码里面的函数内代码,是根据函数地址做偏移的。
所以查找地址要换算一下:
函数内地址 = 异常地址 - 函数地址 - 段对齐大小
0x00401028 - 0x00401000 - 0x1000 = 0x28
例:
..........
; 9 : *p = 100;
00025 8b 45 f8 mov eax, DWORD PTR _p$[ebp]
00028 c6 00 64 mov BYTE PTR [eax], 100 ; 00000064H
...........
找到了,这里出问题了。快去修复!
5、运气好的话,cod文件里面带有源码行号或者直接源码(生成文件的时候设置所得)。
这里生成cod文件的时候有些选择,如 机器码,源码等等,如果汇编语言学得好,没源码也知道怎么回事。
能看源码,为什么不呢。
PS: 最后,怎么得到 map 文件 和 cod 文件,就根据自己所用开发环境配置编译即可(注意文件编码问题√,这绝对是个坑)。