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里面的内存错误????
一个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里面的内存错误????
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
同样没有找到
而堆上的越界稍微麻烦点,堆上的内存写入越界,如果没有写到未申请的内存区,那就不会立即出错,要访问被覆盖的越界区域时才会出错.
如果你觉得很大的可能是CopyMemory函数(也就是Move函数)出错的话,可以这样,InLine Hook Move函数,把参数和返回地址记录到文件中,当出现出错时,最后几条Move记录通常就是错误所在了,
如果判断一下Move目标地址和目标地址+大小是否都在申请的范围内然后再记录那就最好了,如果不在范围内就直接记录,不过这需要对GetMem.inc文件有深入的研究才行.数组越界的话就很难找了.
我是设置了 “project -> options -> Linker -> Map file 选择detailed.” 和 “Project -> Options -> Compiler 中的 Debugging 的 Use Debug DCUs 打勾” 。还要设置哪些地方???根据我顶楼的情况,我不采纳单步方案!