使用 PageHeap 实用工具检测 Visual C++ 项目中的内存错误

本文介绍如何使用 PageHeap 实用工具检测 Microsoft Visual C++ 项目中的内存错误。 本文中的信息仅适用于非托管的 Visual C++ 代码。

原始产品版本: Visual C++
原始 KB 数: 264471

总结

可以为应用程序启用 PageHeap 实用工具,以便自动监视所有 malloc分配 newheapAlloc 监视内存错误。

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 示例

  1. 生成 pgh 项目并运行pgh.exe。

    注意

    必须执行 PageHeap 的发布版本才能使用 newmalloc

    启动PageHeap1.exe。 此时会弹出一个对话框。

  2. 在对话框中,可以看到 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:代码生成>使用运行时库)。

  3. 选中“错误分配/释放”框后,如果内存分配大小为 5 字节,请在新按钮上选择,将分配 5 字节内存,并将 0 写入第六个字节。 写入第六个字节是一个非法的内存覆盖,但在删除内存之前,PageHeap 不会检测到此错误。 选择“删除”按钮时,PageHeap 将检测覆盖,你将看到类似于以下示例的错误消息框:

    已达到异常断点 A 断点。 (0x80000003)发生在应用程序的位置0x77f9f9df。

    如果已将 Visual C++指定为实时 (JIT) 调试器,则可以选择“取消按钮并调试代码。

    如果将分配大小更改为 8(或 8 的任意倍数),则选择“新建”、“pageAlloc”或“COM 新建”按钮将导致即时 访问冲突 错误,因为已写入地址且没有访问权限。 (即无需删除内存即可检测错误)。

注意

  1. 限制:PageHeap 只能查找家庭中的 malloc 内存错误(因此C++运算符 new)和 heapAlloc。 许多应用程序使用自定义分配器和 PageHeap 无法截获这些分配。
  2. 测试完应用程序后,请从命令行运行 pageheap /disable <appName> ,以关闭该应用程序的 PageHeap。
  3. 启用了 PageHeap 的应用程序可以消耗比不启用 PageHeap 的同一应用程序更多的内存。 可能需要增加交换文件以满足增加的内存需求。

可以 在此处下载Pageheap1vcnet.exe。 有关如何下载 Microsoft 支持文件的详细信息,请参阅如何从联机服务获取 Microsoft 支持文件

Microsoft 已对该文件进行病毒扫描。 Microsoft 使用的是文件发布时可以获得的最新病毒检测软件。 该文件存储在安全性得到增强的服务器上,以防止对文件进行未经授权的更改。