利用MapFile定位程序崩溃(报红牌)时的代码位置

来源:互联网 发布:域名被墙是什么意思 编辑:程序博客网 时间:2024/05/17 00:57

整理翻译:Mindon 2009 4-23 16:25
原文: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
  

原创粉丝点击