用FastMM检测到程序有内存泄漏后, 生成如下日志文件,但怎样才能定位到发生泄漏的源码位置呢?A memory block has been leaked. The size is: 36Stack trace of when this block was allocated (return addresses):
402AF7
404F29
404F54
4BB948
7C93B686 [wcsncat]
7C98D8A2 [RtlpNtMakeTemporaryKey]
7C930945 [RtlAcquirePebLock]
7C93094E [RtlAcquirePebLock]
7C930970 [RtlReleasePebLock]
7C933E6F [RtlDetermineDosPathNameType_U]The block is currently used for an object of class: UnknownThe allocation number is: 43381Current memory dump of 256 bytes starting at pointer address 15D7AA0:
01 00 00 00 1A 00 00 00 43 4D 20 52 65 65 73 74 61 62 6C 69 73 68 6D 65 6E 74 20 52 65 71 75 65
73 74 00 00 98 0E 1B 93 00 00 00 00 10 7A 5D 01 00 00 00 00 00 00 00 00 FF FF FF FF 00 00 00 00
73 A9 00 00 F7 2A 40 00 29 4F 40 00 54 4F 40 00 48 B9 4B 00 86 B6 93 7C A2 D8 98 7C 45 09 93 7C
4E 09 93 7C 70 09 93 7C 6F 3E 93 7C 75 4E 40 00 CF 5A 40 00 59 5A 40 00 34 5B 40 00 FE 67 42 00
4B 3F 40 00 D7 A4 51 00 4B 3F 40 00 7B BA 54 00 92 BC 96 7C 20 00 00 00 00 00 00 00 01 F2 E4 6C
01 00 00 00 17 00 00 00 4C 6F 63 61 74 69 6F 6E 20 55 70 64 61 74 65 20 52 65 71 75 65 73 74 00
FE 0D 1B 93 80 80 80 80 00 00 00 00 10 7A 5D 01 00 00 00 00 00 00 00 00 FF FF FF FF 00 00 00 00
74 A9 00 00 F7 2A 40 00 29 4F 40 00 54 4F 40 00 48 B9 4B 00 86 B6 93 7C A2 D8 98 7C 45 09 93 7C
. . . . . . . . C M R e e s t a b l i s h m e n t R e q u e
s t . . ? . . ? . . . . . z ] . . . . . . . . . . . . .
s ? . . ? * @ . ) O @ . T O @ . H ? K . ? ? ? | ? ? ? | E . ? |
N . ? | p . ? | o > ? | u N @ . ? Z @ . Y Z @ . 4 [ @ . ? g B .
K ? @ . ? ? Q . K ? @ . { ? T . ? ? ? | . . . . . . . . ? ? l
. . . . . . . . L o c a t i o n U p d a t e R e q u e s t .
? . . ? € € € € . . . . . z ] . . . . . . . . . . . . .
t ? . . ? * @ . ) O @ . T O @ . H ? K . ? ? ? | ? ? ? | E . ? |
402AF7
404F29
404F54
4BB948
7C93B686 [wcsncat]
7C98D8A2 [RtlpNtMakeTemporaryKey]
7C930945 [RtlAcquirePebLock]
7C93094E [RtlAcquirePebLock]
7C930970 [RtlReleasePebLock]
7C933E6F [RtlDetermineDosPathNameType_U]The block is currently used for an object of class: UnknownThe allocation number is: 43381Current memory dump of 256 bytes starting at pointer address 15D7AA0:
01 00 00 00 1A 00 00 00 43 4D 20 52 65 65 73 74 61 62 6C 69 73 68 6D 65 6E 74 20 52 65 71 75 65
73 74 00 00 98 0E 1B 93 00 00 00 00 10 7A 5D 01 00 00 00 00 00 00 00 00 FF FF FF FF 00 00 00 00
73 A9 00 00 F7 2A 40 00 29 4F 40 00 54 4F 40 00 48 B9 4B 00 86 B6 93 7C A2 D8 98 7C 45 09 93 7C
4E 09 93 7C 70 09 93 7C 6F 3E 93 7C 75 4E 40 00 CF 5A 40 00 59 5A 40 00 34 5B 40 00 FE 67 42 00
4B 3F 40 00 D7 A4 51 00 4B 3F 40 00 7B BA 54 00 92 BC 96 7C 20 00 00 00 00 00 00 00 01 F2 E4 6C
01 00 00 00 17 00 00 00 4C 6F 63 61 74 69 6F 6E 20 55 70 64 61 74 65 20 52 65 71 75 65 73 74 00
FE 0D 1B 93 80 80 80 80 00 00 00 00 10 7A 5D 01 00 00 00 00 00 00 00 00 FF FF FF FF 00 00 00 00
74 A9 00 00 F7 2A 40 00 29 4F 40 00 54 4F 40 00 48 B9 4B 00 86 B6 93 7C A2 D8 98 7C 45 09 93 7C
. . . . . . . . C M R e e s t a b l i s h m e n t R e q u e
s t . . ? . . ? . . . . . z ] . . . . . . . . . . . . .
s ? . . ? * @ . ) O @ . T O @ . H ? K . ? ? ? | ? ? ? | E . ? |
N . ? | p . ? | o > ? | u N @ . ? Z @ . Y Z @ . 4 [ @ . ? g B .
K ? @ . ? ? Q . K ? @ . { ? T . ? ? ? | . . . . . . . . ? ? l
. . . . . . . . L o c a t i o n U p d a t e R e q u e s t .
? . . ? € € € € . . . . . z ] . . . . . . . . . . . . .
t ? . . ? * @ . ) O @ . T O @ . H ? K . ? ? ? | ? ? ? | E . ? |
解决方案 »
- 未定义问题
- 奇怪問題,為什麼在我的dbgrid裡面總是只顯示最後一筆資料。
- 近万条不同的数据一次性插入不同的表中,如何提高速度???急!!!
- delphi与SqlServer数据库的链接
- 这个问题怎么解决?
- 请问各位老师delphi 如何实现对 MS SQL SERVER数据
- 怎样在打印机上输出图形?
- 通过“新建应用程序”新建的form和“New Form”新建的 Form 有何不同吗?
- 查询与现在时间相差2分钟的记录,这条语句(time-12.5/60/60)该怎么改?
- 彩笔求助。delphi安装问题
- delphi高手请进来看看代码那里有问题
- bmp.scanline和getpixel获取的颜色为什么会不同呢?
---------------------------------------------------
有了这份报告只不过了解到内存泄漏存在,但是哪里没释放就还需要更进一步地调查。
调查的目标有:
1.内存块分配在哪个函数里哪段代码。 这个在报告里可以结合内容和调用堆栈来看。前256个字节可以进行分析,推测分配者,调用堆栈就直接指出了分配函数,不过是一些地址,不能直接知道函数名和代码­段。这时候就需要在delphi
ide环境下查看二进制内存映像了,就是View CPU功能。 在设定断点并停下后,可以View CPU,在菜单View=>Debug
Window=>CPU 快捷键:Ctrl+Alt+C View CPU Window:
正中就是内存映像,而且源码也相应地标注好了,左边列的地址就是内存报告中的Call
Stack中的地址,翻页找到所对应的代码就知道哪里分配内存了。 2.检查释放内存的地方是否被调用,可以用日志或断点来调试,如果压根就没有释放内存那就补上代码,如果有却没有执行则检查一下执行条件是否正确,如果断点没起­作用很可能是因为代码永远不会被执行(死代码)。
-----------------------------------------------------确切的说, 就是再通过调试cpu 窗口 来定位,还是没看明白,求助?