本文介绍如何使用 PageHeap 实用工具检测 Microsoft Visual C++ 项目中的内存错误。 本文中的信息仅适用于非托管的 Visual C++ 代码。
原始产品版本: Visual C++
原始 KB 数: 264471
总结
可以为应用程序启用 PageHeap 实用工具,以便自动监视所有 malloc
分配 new
并 heapAlloc
监视内存错误。
PageHeap1 是一个 Visual C++ 项目,其中包含多种类型的内存错误。 若要在此示例应用程序中启用 PageHeap,请从命令行键入以下内容:
pageheap /enable pgh.exe 0x01
然后,键入以下内容:
pageheap
注意
PageHeap 监视的应用程序名称。
对于许多应用程序, 0x01
是唯一需要的标志。 可以通过从命令行使用问号标志 (/?
) 运行 PageHeap 来获取有关其使用情况的详细信息。
PageHeap 的工作原理
PageHeap 返回指向 8 字节边界上已分配内存的指针。 返回的指针的末尾后跟 0 到 7 个防护字节(根据所请求的大小,将添加 0 个字节到 7 个字节,以将请求大小舍入为 8 字节边界),后跟标记为 PAGE_NOACCESS
内存页(有关详细信息,请参阅 VirtualAlloc)。 例如:
char * p;
p = new char[5];
PageHeap 返回指向 5 个字节和 3 个防护字节的指针,总共构成 8 个字节,例如.....XXX. 如果内存分配大小是 8 的倍数,则不会向返回的指针添加保护字节。
如果覆盖分配的末尾,则保护字节更改,PageHeap 在释放内存时会导致 访问冲突 错误。 如果应用程序读取或写入分配(包括防护字节),则会产生即时 访问冲突 错误。
如何使用 PageHeap1 示例
生成 pgh 项目并运行pgh.exe。
注意
必须执行 PageHeap 的发布版本才能使用
new
或malloc
。启动PageHeap1.exe。 此时会弹出一个对话框。
在对话框中,可以看到 TextBox、“错误的分配/免费”复选框和三对按钮、new 和 delete、PageAlloc & Heap Free 和 COM new & COM Delete。 TextBox 采用要分配的内存大小。 如果选择了“错误的分配/免费”复选框,则每个分配类型(new、PageAlloc 和 COM new)都会分配内存,然后写入分配。 如果未检查 Bad Alloc,则不会发生内存覆盖。
按钮新测试
new
运算符,按钮 PageAlloc 测试HeapAlloc
。 COM 新版不使用CoTaskMemAlloc
,而是调用仅调用new
的 COM 动态链接库 (DLL)。 若要测试 COM 新,必须注册 r1LeakMemMod.dll 或生成 r1LeakMemMod 项目。可以使用适用于 PageHeap 的运行时 DLL 库。 (从 Visual C++ 集成开发环境 (IDE) 项目>设置>C++>Category:代码生成>使用运行时库)。
选中“错误分配/释放”框后,如果内存分配大小为 5 字节,请在新按钮上选择,将分配 5 字节内存,并将 0 写入第六个字节。 写入第六个字节是一个非法的内存覆盖,但在删除内存之前,PageHeap 不会检测到此错误。 选择“删除”按钮时,PageHeap 将检测覆盖,你将看到类似于以下示例的错误消息框:
已达到异常断点 A 断点。 (0x80000003)发生在应用程序的位置0x77f9f9df。
如果已将 Visual C++指定为实时 (JIT) 调试器,则可以选择“取消”按钮并调试代码。
如果将分配大小更改为 8(或 8 的任意倍数),则选择“新建”、“pageAlloc”或“COM 新建”按钮将导致即时 访问冲突 错误,因为已写入地址且没有访问权限。 (即无需删除内存即可检测错误)。
注意
- 限制:PageHeap 只能查找家庭中的
malloc
内存错误(因此C++运算符new
)和heapAlloc
。 许多应用程序使用自定义分配器和 PageHeap 无法截获这些分配。 - 测试完应用程序后,请从命令行运行
pageheap /disable <appName>
,以关闭该应用程序的 PageHeap。 - 启用了 PageHeap 的应用程序可以消耗比不启用 PageHeap 的同一应用程序更多的内存。 可能需要增加交换文件以满足增加的内存需求。
可以 在此处下载Pageheap1vcnet.exe。 有关如何下载 Microsoft 支持文件的详细信息,请参阅如何从联机服务获取 Microsoft 支持文件。
Microsoft 已对该文件进行病毒扫描。 Microsoft 使用的是文件发布时可以获得的最新病毒检测软件。 该文件存储在安全性得到增强的服务器上,以防止对文件进行未经授权的更改。