1. 程式人生 > >利用MapFile定位程式崩潰(報紅牌)時的程式碼位置

利用MapFile定位程式崩潰(報紅牌)時的程式碼位置

原文:http://www.codeproject.com/KB/debug/mapfile.aspx

1、生成MapFile
Project—Setting—C+±—DebugInfo,選擇Line Numbers Only
Project—Setting—Link—選擇Generator mapfile;Project Options加入/MAPINFO:LINES /MAPINFO:EXPORTS

2、 讓程式崩潰
char* pEmpty = NULL;
*pEmpty = ‘x’;

3、程式報出如下錯誤
“0x00401312"指令引用的"0x000000000"記憶體。該記憶體不能為"written”。
要中止程式,請單擊“確定”
要調式程式,請單擊“取消“。

4、定位錯誤
(1)定位檔案
得到出錯指令的偏移量
0x00401312減去MapFile記錄的Preferred load address(MapFile第3行)
0x00401312-0x00400000=0x1312
在MapFile中找出是哪個檔案?
在Rva+Base中找到第一個大於出錯指令的obj的前一個obj就是出錯的檔案。

(2)定位程式碼行
0x1312-0x1000=0x312(出錯指令在單元的地址)

Line numbers for ./Release/MapFile1Dlg.obj(E:/2-研發庫/BugReport/MapFile/MapFile1/MapFile1Dlg.cpp) segment .text

41 0001:00000160    44 0001:00000172    53 0001:00000180    64 0001:00000190
69 0001:000001c7    70 0001:000001e4    73 0001:00000220    80 0001:00000230
80 0001:00000240    92 0001:00000250    93 0001:0000026a   101 0001:0000026f
102 0001:00000283   104 0001:00000287   105 0001:00000290   106 0001:000002a3
108 0001:000002ae   109 0001:000002c4   111 0001:000002d4   115 0001:000002e5
116 0001:000002fc   122 0001:0000030d   125 0001:00000330   126 0001:0000033e
128 0001:00000356   129 0001:0000035f   130 0001:00000370   135 0001:00000381
133 0001:00000392   135 0001:00000397   142 0001:000003b0   143 0001:000003b6
145 0001:000003ca   147 0001:000003d4   150 0001:000003f1   151 0001:000003fb
153 0001:00000403   158 0001:00000412   159 0001:00000447   164 0001:00000453
162 0001:00000457   164 0001:0000045f   169 0001:00000470   171 0001:00000473

0x312在以下地址範圍(0x0000030d—0x00000330),程式碼行在122–125之間。122 0001:0000030d 125 0001:00000330

作者:m_star_jy_sy
來源:CSDN
原文:https://blog.csdn.net/m_star_jy_sy/article/details/4129266?utm_source=copy
版權宣告:本文為博主原創文章,轉載請附上博文連結!