有時候我們的程序crash了,會出現一個crash界面提示我們在什么位置中斷了。我們如何根據這個中斷地址找到對應的行號呢?
要想達到這樣的目的,首先要進行一些工程屬性的配置。
c/c++->常規->調試信息格式->程序數據庫
c/c++->優化->優化->禁用
鏈接器->調試->生成調試信息->是
->生成映射文件->是
->映射文件名稱->$(OutDir)/$(ProjectName).map
->映射導出->是
->映射行->是
1 int main (int argc, char* argv[])
2 {
3 char * p = 0;
4 *p = 'c';
5 return 0;
6 }
當執行程序的時候,顯示“test1.exe中的0x0040100e處未處理的異常:0xc000005:寫入位置0x00000000時發生訪問沖突”
這個時候來看一下map文件。首先看到的是參考的加載地址: Preferred load address is 00400000
Timestamp is 4639462c (Thu May 03 10:17:16 2007)
Preferred load address is 00400000
Start Length Name Class
0001:00000000 00003b58H .text CODE
0002:00000000 000000c4H .idata$5 DATA
0002:000000d0 00000c40H .rdata DATA
0002:00000d10 00000048H .rdata$debug DATA
0002:00000d60 00000008H .rdata$sxdata DATA
0002:00000d68 00000004H .rtc$IAA DATA
0002:00000d6c 00000004H .rtc$IZZ DATA
0002:00000d70 00000004H .rtc$TAA DATA
0002:00000d74 00000004H .rtc$TZZ DATA
0002:00000d78 00000014H .idata$2 DATA
0002:00000d8c 00000014H .idata$3 DATA
0002:00000da0 000000c4H .idata$4 DATA
0002:00000e64 00000366H .idata$6 DATA
0002:000011ca 00000000H .edata DATA
0003:00000000 00000004H .CRT$XCA DATA
0003:00000004 00000004H .CRT$XCAA DATA
0003:00000008 00000004H .CRT$XCZ DATA
0003:0000000c 00000004H .CRT$XIA DATA
0003:00000010 00000008H .CRT$XIC DATA
0003:00000018 00000004H .CRT$XIZ DATA
0003:0000001c 00000004H .CRT$XPA DATA
0003:00000020 00000004H .CRT$XPZ DATA
0003:00000024 00000004H .CRT$XTA DATA
0003:00000028 00000004H .CRT$XTZ DATA
0003:00000030 00000274H .data DATA
0003:000002c0 00000598H .bss DATA
crash地址計算:calculation: crash_address - preferred_load_address - 0x1000
0x0040100e -0x00400000-0x1000=0x0000000e
接著在map中查找對應的obj
Address Publics by Value Rva+Base Lib:Object
0000:00000000 __except_list 00000000 <absolute>
0000:00000002 ___safe_se_handler_count 00000002 <absolute>
0001:00000000 _main 00401000 f test1.obj
0001:00000017 __amsg_exit 00401017 f LIBC:crt0.obj
0001:0000003c _mainCRTStartup 0040103c f LIBC:crt0.obj
0001:00000203 ___crtExitProcess 00401203 f LIBC:crt0dat.obj
最后根據obj和計算的值在map中找第一個小于我們所計算的值的位置
Line numbers for .\release\test1.obj(d:\test\test1\test1\test1.cpp) segment .text
2 0001:00000000 3 0001:00000004 4 0001:0000000b 5 0001:00000011
然后在.map中查找第一個小于我們所計算的值的位置
所以我們的中斷位置是在第4行