### MemProof操作说明详解
#### 一、MemProof概述
MemProof是一款由Atanas Stoyanov开发并由AutomatedQA公司支持的内存泄漏检测工具,适用于基于WIN32平台的应用程序开发,如使用DELPHI/C++Builder等工具进行编程。MemProof能够帮助开发者在开发过程中发现内存泄漏问题,并提供详细的报告来定位问题所在。尽管目前AutomatedQA公司更倾向于推广其产品AQTime(一款更为全面的性能和资源监控工具),但MemProof仍然拥有广泛的用户基础,并且对于某些特定的需求来说,MemProof仍然是一个非常好的选择。
#### 二、MemProof安装与配置
MemProof的最新版本可以从AutomatedQA的官方网站下载,当前版本为Build 0.950 (发布日期:2004年7月19日)。安装过程非常简单,只需运行MemProof.exe即可完成安装。
安装完成后,为了确保MemProof能够正确地工作,还需要对项目进行相应的配置:
1. **编译器设置**:
- 取消选中“优化”选项,因为优化可能会导致调试信息丢失。
- 选中“堆栈帧”以获取详细的堆栈跟踪信息。
- 选中“调试信息”以生成DCU文件,这对于后期的调试非常重要。
- 选中“使用调试DCU”以确保包含尽可能多的调试信息。
2. **链接器设置**:
- 选中“详细MAP文件”选项,以便于查看链接器产生的MAP文件,这些文件包含了程序中各个模块的信息。
- 选中“包含TD32调试信息”,这将使得生成的可执行文件包含调试信息。
#### 三、示例代码
为了演示MemProof如何工作,可以创建一个简单的Delphi项目,并在`OnCreate`事件中添加以下代码:
```delphi
procedure TForm1.FormCreate(Sender: TObject);
begin
TFont.Create; // 创建一个TFont对象
CloseHandle(0); // 关闭一个句柄
end;
```
这段代码创建了一个TFont对象并关闭了一个句柄,这些都是可能导致内存泄漏的操作。
#### 四、资源监控
MemProof提供了丰富的资源监控功能,主要包括以下几个方面:
1. **C源代码资源**:
- `Current#`:当前使用的资源数量。
- `Peak#`:达到的最大资源数量。
- `Current Size`:当前使用的资源大小。
- `Peak Size`:达到的最大资源大小。
2. **内存**:包括常规内存和GDI、User、Kernel、Registry等特定类型的内存资源。
通过选择“文件 -> 打开”打开待测试的可执行文件,然后通过“运行 -> 运行”开始测试,MemProof会自动生成资源详细报告。
#### 五、高级配置
为了使MemProof更好地识别各种资源类型及其来源,需要进行一些高级配置:
1. **搜索目录配置**:通过`Configure -> Search Directories`或`Projects -> Search Directories`设置搜索路径。默认情况下,MemProof不会自动添加Delphi VCL的源文件路径,因此需要手动添加以确保所有使用的库文件都能被正确识别。
2. **宿主应用程序参数**:通过`Project -> Parameters -> Host Applications`设置应用程序参数。这对于Delphi应用程序特别有用,因为它允许MemProof更好地集成到现有的开发环境中。
3. **进程附加模式**:除了传统的启动模式外,MemProof还支持附加到现有进程的方式,这对于测试正在运行的应用程序非常有用。
#### 六、示例分析
假设在测试过程中,MemProof报告了以下几种资源泄露情况:
1. **虚拟分配**:`VirtualAlloc(0x00000000, 4096, 4096, 64)`。这表示在内核32位DLL中分配了4096字节的内存。这种泄露通常是由于未释放内存或者错误地分配内存所导致的。
2. **文件映射**:`OpenFileMapping(4, 0, "SMBuffer")`。这是在使用BDE数据库引擎时发生的,表明存在文件映射对象没有被正确关闭的情况。
3. **加载光标**:在使用VCL组件时经常会发生此类泄露。例如,在调用`LoadCursor`函数时未能正确处理。
4. **其他常见的内存泄露问题**:包括但不限于在使用Delphi/C++ Builder进行开发时的一些常见错误。
通过以上详细介绍,我们可以看到MemProof不仅是一款强大的内存泄漏检测工具,还能帮助开发者深入理解内存管理的重要性以及如何有效地解决内存泄漏问题。