RT
一个exe ,看不出里面哪边会有内存错误,而且是 又是执行会有,有时执行又不会出现...总得找到问题在哪里啊 !!!~~~ 我郁闷...网上看了 用map文件定位代码的方式 :http://hi.baidu.com/suny212/item/aa37808664b221ded0f8cd6c#
我按照它的代码测试了一下,我也找到了内存错误的 代码行。但是我又写了一个测试代码:procedure TForm1.Button2Click(Sender: TObject);
var i, j:integer;
begin
  CopyMemory(@i, @j, sizeof(integer)*100);
end;
报的错误是:“Access violation at address 00D83C6B. Write of address 3D47312C.”
按照网页上的方法,就找不到出错的 代码行...请问 有啥好的定位 内存错误 代码的方式??? 
或者 讲下怎么样用map文件定位我Button2Click里面的内存错误????

解决方案 »

  1.   


    procedure TForm1.Button2Click(Sender: TObject);
    var i, j:integer;
        pi :PInteger;
        pc :PChar;
    begin
    //  CopyMemory(@i, @j, sizeof(integer)*100);
      GetMem(pc, 4);
      CopyMemory(pc, @j, sizeof(integer)*10000);
    end;
    这个,报的错误是:“Access violation at address 00402A0D in module '_Project1.exe'. Write of address 00138F94.”map文件里面 所有 出现“1A0D”的地方:查找全部 "1A0D", 隐藏, 查找结果 1, 当前文档
      C:\Documents and Settings\opos\桌面\D_Test\_Project1.map(11184):  3308 0001:00001A07  3309 0001:00001A0A  3310 0001:00001A0C  3311 0001:00001A0D
      C:\Documents and Settings\opos\桌面\D_Test\_Project1.map(14011):  3367 0001:0001A0D0  3368 0001:0001A0D3  3370 0001:0001A0D4  3371 0001:0001A0D7
      C:\Documents and Settings\opos\桌面\D_Test\_Project1.map(14012):  3373 0001:0001A0D8  3374 0001:0001A0DB  3375 0001:0001A0E1  3376 0001:0001A0E2
    匹配行: 3
    同样没有找到
      

  2.   

    栈上的数据Move(CopyMemory)越界或者数组访问越界的话,通常是把返回地址给覆盖了,就像报的错误是:“Access violation at address 00D83C6B. Write of address 3D47312C.” 代码位于:00D83C6B,这个地址偏离0040000太远,通常情况下就是栈上的数据复制溢出了,这种错误好找,通常情况下,这个函数或者方法结束的时候就出错了,
    而堆上的越界稍微麻烦点,堆上的内存写入越界,如果没有写到未申请的内存区,那就不会立即出错,要访问被覆盖的越界区域时才会出错.
    如果你觉得很大的可能是CopyMemory函数(也就是Move函数)出错的话,可以这样,InLine Hook Move函数,把参数和返回地址记录到文件中,当出现出错时,最后几条Move记录通常就是错误所在了,
    如果判断一下Move目标地址和目标地址+大小是否都在申请的范围内然后再记录那就最好了,如果不在范围内就直接记录,不过这需要对GetMem.inc文件有深入的研究才行.数组越界的话就很难找了.
      

  3.   

    你可以找到错误的那个Move调用地,然后就知道源代码的位置了
      

  4.   

    设置DEBUG编译模式,并生成MAP文件
      

  5.   

    这个算是怎么弄??
    我是设置了 “project   ->   options   ->   Linker   ->   Map   file   选择detailed.” 和 “Project   ->   Options   ->   Compiler   中的   Debugging   的   Use   Debug   DCUs  打勾” 。还要设置哪些地方???根据我顶楼的情况,我不采纳单步方案!
      

  6.   

    写log,每步执行的log写到文件,看是执行到哪步报的错,然后分析那段代码,或者单步调试。