FASTMM

http://blog.sina.com.cn/s/blog_4dcd6c6701000bmt.html

因大家提到Delphi程序中存在较多内存泄漏问题,现找到一个工具,对查报Delphi程序中的泄漏问题很有效的工具FASTMM,
安装使用比较简单,现发给大家附使用说明。
如使用上问题,请告诉我,让我们一块研究。

使用说明如下:
1.打开FastMM4的调试功能,首先在自己的project里把FastMM4放在最前面,例如:
FastMM4,
Main in ‘Main.pas’ {MainForm},

再修改FastMM4Options.inc,打开全调试模式。例:
{$define FullDebugMode}
也可以在project中定义编译常量:FullDebugMode。同时把FastMM_FullDebugMode.dll拷贝到编译后生成的可执行程序所在目录。
再要打开内存泄漏报告:EnableMemoryLeakReporting。一般情况下是缺省打开的。
这样就打开了全调试模式,如果发生内存泄漏将会生成报告文件,如果在IDE运行的时候还会弹出一个对话框显示。报告文件类似:XXX_MemoryManager_EventLog.txt

2.报告文件由两部分组成,并且是每次运行append。

第一部分是泄漏的详细内容,将每个没释放的内存块详细信息显示出来。例:
A memory block has been leaked. The size is: 28 {一个28字节的内存块在程序结束后没有被释放}

{这个内存块在分配的时候的调用堆栈,也就是Call Stack,可以清楚看出调用函数的次序。如果是系统dll则还有相应的函数名。}
Stack trace of when this block was allocated (return addresses):
4028E7
4030EC
406649
412365
41236E
411DD3
426B45
427236
42888C
{这个内存类型,如果是字符串string或TObject继承的对象则会显示名称及行号。}
The block is currently used for an object of class: Unknown
{将内存块头256个字符显示出现,作为内容提示。}
Current memory dump of 256 bytes starting at pointer address 107BDD8:

第二部分是总结性内容,例:

{这个小型内存块泄漏的报告,如果有大型内存块泄漏则会加一行专门提示大型内存块泄漏。}
This application has leaked memory. The small block leaks are (excluding expected leaks registered by pointer):

{21-28字节的内存块泄漏,未知类型一个}
21 - 28 bytes: Unknown x 1

Note: Memory leak detail is logged to a text file in the same folder as this application. To disable this memory leak check, undefine “EnableMemoryLeakReporting”.

有了这份报告只不过了解到内存泄漏存在,但是哪里没释放就还需要更进一步地调查。

调查的目标有:

1.内存块分配在哪个函数里哪段代码。

这个在报告里可以结合内容和调用堆栈来看。前256个字节可以进行分析,推测分配者,调用堆栈就直接指出了分配函数,不过是一些地址,不能直接知道函数名和代码段。这时候就需要在delphi ide环境下查看二进制内存映像了,就是View CPU功能。

在设定断点并停下后,可以View CPU,在菜单View=>Debug Window=>CPU 快捷键:Ctrl+Alt+C

View CPU Window:

正中就是内存映像,而且源码也相应地标注好了,左边列的地址就是内存报告中的Call Stack中的地址,翻页找到所对应的代码就知道哪里分配内存了。

2.检查释放内存的地方是否被调用,可以用日志或断点来调试,如果压根就没有释放内存那就补上代码,如果有却没有执行则检查一下执行条件是否正确,如果断点没起作用很可能是因为代码永远不会被执行(死代码)。

这要靠经验和调试,基本上借助IDE和内存报告就可以很好地防止内存泄漏。同时要加强测试用例,争取在测试用例中能遍历到所有的代码和大部分关键功能,这样内存泄漏报告就会更准确一点。

fastmm每次在程序关闭后就会根据情况生成内存泄漏报告,如果没有弹出内存泄漏警告则恭喜你,内存管得很好。

另:

1.内存管理不是GC自动回收内存,而是检查是否有泄漏。

2.windows系统的内存泄漏是无法检查的,仅限于应用程序内部,不过检查出系统泄漏也没办法,只能等更新了。

3.检查泄漏后要自己去检查代码补齐内存释放,报告并不能做这事。

安装 Delphi 11 中的 FastMM 是一个相对简单的过程。FastMM 是一款强大的内存管理工具,可以帮助我们在开发过程中更好地管理和优化内存使用。 以下是安装 FastMM 的步骤: 1. 首先,下载 FastMM 的安装文件。可以在 FastMM 的官方网站或其他可信的下载网站上找到它。确保下载适用于 Delphi 11 的版本。 2. 下载完成后,解压安装文件,并打开解压后的文件夹。该文件夹中应该包含 FastMM 的源代码和一些其他相关文件。 3. 打开 Delphi 11。在“工具”菜单中,选择“导入工具”或“安装组件”选项。 4. 在弹出的对话框中,点击“添加”按钮,并选择 FastMM 的源代码文件(通常为 FastMM4.pas)。 5. 然后,点击“打开”按钮,返回到安装对话框。 6. 在安装对话框中,可以选择编译成静态库或动态库的方式。这里我们选择编译成动态库(DLL)的方式,方便以后在其他项目中共享。 7. 点击“编译”按钮开始编译。 8. 编译完成后,点击“安装”按钮进行安装。安装完成后,可以关闭安装对话框。 9. 现在,FastMM 已经安装在 Delphi 11 中了,可以在开发过程中使用它来进行内存管理。 安装完成后,我们可以在 Delphi 11 的项目中使用 FastMM。为了使用它,只需在项目文件的使用部分添加 FastMM 单元即可。例如,在项目文件的 interface 部分添加“uses FastMM4;”语句。 总体而言,安装 Delphi 11 中的 FastMM 相对简单。通过按照上述步骤,我们可以很容易地将其集成到我们的开发环境中,并利用其强大的内存管理功能优化我们的程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值