转 Delphi中使用FastMM4结合View CPU避免内存泄漏
http://www.cnblogs.com/kongchao/archive/2009/10/27/1590479.html
核心提示:内存泄漏经常出现在本地代码中,特别是多线程和发生异常的情况下,这时候在delphi环境下,FastMM4就特别有用。...FastMM4是非常高效可靠的内存管理器,用来替代久久不更新的borland内存管理器是最好的。地址:http://sourceforge.net/projects/fastmm/
调试过程如下:
1.打开FastMM4的调试功能,首先在自己的project里把FastMM4放在最前面,例如:
FastMM4,
Main in ‘Main.pas’ {MainForm},
再修改FastMM4Options.inc,打开全调试模式。例:
{$define FullDebugMode}
也可以在project中定义编译常量:FullDebugMode。同时把FastMM_FullDebugMode.dll拷贝到编译后生成的可执行程序所在目录。
再要打开内存泄漏报告:EnableMemoryLeakReporting。一般情况下是缺省打开的。
这样就打开了全调试模式,如果发生内存泄漏将会生成报告文件,如果在IDE运行的时候还会弹出一个对话框显示。报告文件类似:kicoy_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
正中就是内存映像,而且源码也相应地标注好了,左边列的地址就是内存报告中的Call Stack中的地址,翻页找到所对应的代码就知道哪里分配内存了。
2.检查释放内存的地方是否被调用,可以用日志或断点来调试,如果压根就没有释放内存那就补上代码,如果有却没有执行则检查一下执行条件是否正确,如果断点没起作用很可能是因为代码永远不会被执行(死代码)。
这要靠经验和调试,基本上借助IDE和内存报告就可以很好地防止内存泄漏。同时要加强测试用例,争取在测试用例中能遍历到所有的代码和大部分关键功能,这样内存泄漏报告就会更准确一点。
fastmm每次在程序关闭后就会根据情况生成内存泄漏报告,如果没有弹出内存泄漏警告则恭喜你,内存管得很好。
现在总算不用羡慕虚拟机代码自动回收内存了,本地代码的内存管理也不是两眼一抹黑了,这是可以精确控制的,一切尽在掌握中。
另:
1.内存管理不是GC自动回收内存,而是检查是否有泄漏。
2.windows系统的内存泄漏是无法检查的,仅限于应用程序内部,不过检查出系统泄漏也没办法,只能等更新了。
3.检查泄漏后要自己去检查代码补齐内存释放,报告并不能做这事。
转 Delphi中使用FastMM4结合View CPU避免内存泄漏的更多相关文章
- 利用windbg分析崩溃,句柄泄漏,死锁,CPU高,内存泄漏
Windbg的一些简单使用命令 一.崩溃 1. 输入.ecxr;kbn得到崩溃的堆栈 其中源代码如下 2. 查看堆栈和源代码,发现第0帧导致崩溃,代码也是本地代码 输入.frame 0,切到第0 ...
- Android中由Handler和内部类引起的内存泄漏
原文地址:http://johnnyshieh.github.io/android/2015/09/03/android-handler-memory-leak/ 在Android中我们经常用Hand ...
- delphi中如何将一整个文件读入内存
来源 https://bbs.csdn.net/topics/390985048 分配一块大内存吧,要是一下申请不了64M那么大,就多申请几块小的,用个链表连起来.用FileStream类的方法读取文 ...
- Delphi中堆栈区别
http://blog.csdn.net/zang141588761/article/details/52838728 Delphi中堆栈区别 2016-10-17 14:49 277人阅读 评论( ...
- Java如何获取系统cpu、内存、硬盘信息
1 概述 前段时间摸索在Java中怎么获取系统信息包括cpu.内存.硬盘信息等,刚开始使用Java自带的包进行获取,但这样获取的内存信息不够准确并且容易出现找不到相应包等错误,所以后面使用sigar插 ...
- android 中如何分析内存泄漏
转载:http://blog.csdn.net/fulinwsuafcie/article/details/8363218 前提条件: 1,电脑安装了java 运行环境 2,手机端开启了 USB 调试 ...
- 在 JNI 编程中避免内存泄漏
JAVA 中的内存泄漏 JAVA 编程中的内存泄漏,从泄漏的内存位置角度可以分为两种:JVM 中 Java Heap 的内存泄漏:JVM 内存中 native memory 的内存泄漏. Java H ...
- C++中内存泄漏的检测方法介绍
C++中内存泄漏的检测方法介绍 首先我们需要知道程序有没有内存泄露,然后定位到底是哪行代码出现内存泄露了,这样才能将其修复. 最简单的方法当然是借助于专业的检测工具,比较有名如BoundsCheck, ...
- 在 JNI 编程中避免内存泄漏与崩溃
JNI 编程简介 JNI,Java Native Interface,是 native code 的编程接口.JNI 使 Java 代码程序可以与 native code 交互——在 Java 程序中 ...
随机推荐
- 【XLL API 函数】xlGetName
以字符串格式返回 DLL 文件的长文件名. 原型 Excel12(xlGetName, LPXLOPER12 pxRes, 0); 参数 这个函数没有参数 属性值和返回值 返回文件名和路径 实例 \S ...
- 安装oracleASM
问题:oracleasm status不能启动 解决方案: [root@localhost ~]# oracleasm statusChecking if ASM is loaded: noCheck ...
- supersr--NSURLSessionConfiguration-下载进度
//// ViewController.m// 下载进度 // // Created by Super on 14/7/4. // Copyright (c) 2014年 iOS. All r ...
- October 12th 2016 Week 42nd Wednesday
Passion is momentary; love is enduring. 激情短暂,真爱长久. What is love? And what is real love? We are alway ...
- JS返回上一页
<button onclick="javascript:history.go(-1);">返回上一页</button> <button oncli ...
- html+css+js实现标签页切换
CSS部分: #Tab { margin:0 auto; width:640px; border:none; position:absolute; z-index:9; margin-left:320 ...
- JAVA作业)01
一,四则运算 (一) 设计思想 使用Scanner类读取运行时用户输入数据,然后进行数据类型转换,完成四则运算之后利用输出类输出. (二) 流程图 (三)程序代码 //Zhangxiaochen ...
- 重温WCF之消息拦截与篡改(八)
我们知道,在WCF中,客户端对服务操作方法的每一次调用,都可以被看作是一条消息,而且,可能我们还会有一个疑问:如何知道客户端与服务器通讯过程中,期间发送和接收的SOAP是什么样子.当然,也有人是通过借 ...
- sdut 2610:Boring Counting(第四届山东省省赛原题,划分树 + 二分)
Boring Counting Time Limit: 3000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 In this problem you a ...
- scala的tcp通信
client: object ActorClient extends App { import actors.Actor, actors.remote.Node, actors.remote.Remo ...