1. 程式人生 > >VC6之MAP檔案生成及格式

VC6之MAP檔案生成及格式

寫一個程式,編譯出來:

#include <stdio.h>

int main(){
    int i = 2;
    int j ;
    scanf("%d",&j);
    i = 2;
    i = 3;
    i = 4;
    i = 5;
    i = 6;
    printf("%d",i/j);
    return 0 ;
}

然後開啟MAP檔案.
裡面有各種全域性符號,大概在檔案的中間位置,有這樣的東西:
Line numbers for ./Debug/4.obj(E:/pro/4/4.cpp) segment .text

     3 0001:00000010     4 0001:00000024     6 0001:0000002b     7 0001:0000003c
     8 0001:00000043     9 0001:0000004a    10 0001:00000051    11 0001:00000058

可以直接Ctrl+F找到程式檔名,我這裡是4.cpp
這些就是程式碼偏移和對應的行號.

三.除錯


就剛才的程式,執行,輸個0,過一下出錯框就來了,
我是VISTA,下面的詳細資訊是:
問題簽名:
問題事件名稱:    APPCRASH
應用程式名:    4.exe
應用程式版本:    0.0.0.0
應用程式時間戳:    499d5ade
故障模組名稱:    4.exe
故障模組版本:    0.0.0.0
故障模組時間戳:    499d5ade
異常程式碼:    c0000094
異常偏移量:    00001063
OS 版本:    6.0.6001.2.1.0.768.3
區域設定 ID:    2052
其他資訊 1:    38fc
其他資訊 2:    db4f9c1c160faa4608f429ddffa01d6f
其他資訊 3:    cb3b
其他資訊 4:    e8ffb2a21d4a9ed7b258f1866c9d3db8

這個偏移就是要看的了。減去1000的程式碼段偏移。
就是63,再對照上面的行號和地址的列表
11 0001:00000058
這個是VC翻譯的時候,第11行顯然會對應多條指令。
這一指令群的開始地址是58.
這個是最接近63且比63小的地址,所以問題應該出在這一行上。
再看程式碼:
printf("%d",i/j);
發現這裡有個除0錯誤。