D:dbgrpt.obj...
对于崩溃地址 0x00401082 而言, 小于此地址中最接近的地址(Rva+Base 中的地址) 为 00401060,其对应的函数名为?Crash1@@YAXXZ,由于所有以问号开头的函数 名称都是 C++ 修饰的名称 ,"@@YAXXZ"则为区别重载函数而加的后缀,所 以?Crash1@@YAXXZ 就是我们的源程序中,Crash1() 这个函数。 排错步骤 2)定位出错行。打开编译生成的"cod"文件,我机器上生成的文件内容如下:
TITLE E:\Crash\Crash。cpp .386Pinclude listing.incif @Version gt 510.model FLATelse_TEXT SEGMENT PARA USE32 PUBLIC ''CODE''_TEXT ENDS_DATA SEGMENT DWORD USE32 PUBLIC ''DATA''_DATA ENDSCONST SEGMENT DWORD USE32 PUBLIC ''CONST''CONST ENDS_BSS SEGMENT DWORD USE32 PUBLIC ''BSS''_BSS ENDS$SYMBOLS SEGMENT BYTE USE32 ''DEBSYM''$SYMBOLS ENDS$TYPES SEGMENT BYTE USE32 ''DEBTYP''$TYPES ENDS_TLS ''CODE''_TEXT ENDSFLAT GROUP _DATA, CONST, _BSS ASSUME CS: FLAT, DS: FLAT, SS: FLATendifPUBLIC ?Crash1@@YAXXZ ec mov ebp, esp 00003 83 ec 40 sub esp, 64 ; 00000040H 00006 53 push ebx 0
0007 56 push esi 00008 57 push edi 00009 8d 7d c0 lea edi, DWORD PTR [ebp-64] 0000c b9 10 00 00 00 mov ecx, 16 ; 00000010H 00011 b8 cc cc cc cc mov eax, -858993460 12 : } 0001f 5f pop edi 00020 5e pop esi 00021 5b pop ebx 00022 83 c4 40 0002f c3 ret 0_main ENDP_TEXT ENDS; COMDAT ?Crash1@@YAXXZ_TEXT SEGMENT_p$ = -4?Crash1@@YAXXZ PROC NEAR ; Crash1, COMDAT; 15 : { 00000 55 push ebp 00001 8b ec mov ebp, esp 00003 83 ec 44 sub esp, 68 ; 00000044H 00006 53 push ebx 00007 56 cc mov eax, -858993460 ; ccccccccH 00016 f3 ab rep stosd; 16 : char * p =(char*)100; 00018 c7 45 fc 64 00 00 00 mov DWORD PTR _p$[ebp], 100 ; 00000064H; 17 : *p=100; 0001f 8b 45 fc mov eax, DWORD PTR _p$[ebp] 00022 c6 00 64 mov BYTE PTR [eax], 100 ; 00000064H; 18 : } 00025 5f pop edi 00026 5e pop esi 00027 5b pop ebx 00028 8b e5 mov esp, ebp 0002a 5d
其中
SEGMENT
; cccccc add
push
pop
?Crash1@@YAXXZ PROC NEAR
; Crash1, COMDAT
为 Crash1 汇编代码的起始行。 产生崩溃的代码便在其后的某个位置。 接下去的一行为:
; 15
: {
冒号后的"{"表示源文件中的语句, 冒号前的"15"表示该语句在源文件中的行数。 这之 后显示该语句汇编后的偏移地址,二进制码,汇编代码。如
00000
55
push
ebp