什么是Page Heap(页堆)?

从Windows 2000 开始操作系统开始在堆管理器引入“校验层”,即Page Heap管理器。这个校验层处于Ntdll.dll模块内。可以验证应用程序所有的动态内存操作(读写、分配、释放及其它操作)。

页堆有两种类型:正常页堆和完全页堆(Full Page Heap)

完全页堆:

当分配一块内存时,通过调整内存块的分配位置,使其结尾恰好与系统分页边界对齐,然后在边界处再多分配一个不可访问的页作为保护区域。这样,一旦出现内存读/写越界时,进程就会Crash,从而帮助及时检查内存越界。

因为每次分配的内存都要以这种形式布局,尤其对于小片的内存分配,即使分配一个字节,也要分配一个内存页,和一个保留的虚拟内存页(注意在目前的实现中,这个用作边界保护区域的页从来不会被提交)。这就需要大量的内存,到底一个进程需要多少内存,很难估算,因此在使用Page Heap前,至少保证你的机器至少设置了1G虚拟内存以上。

正常页堆

正常页堆原理与CRT调试内存分配函数类似,通过分配少量的填充信息,在释放内存块时检查填充区域。来检测内存是否被损坏,此方法的优点是极大的减少了内存耗用量。缺点是只能在释放块时检测,不太好跟踪出错的代码位置。

GFlags、AppVerifier、Pageheap.exe

GFlags、AppVerifier、Pageheap.exe是三种外壳工具,都是用来方便用户配置Page heap 选项的。Page Heap选项位于注册表目录:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\你的可执行程序名\。当Windows开始启动一个进程时,Window通过检查这个注册表目录的设置,对该进程应用相应的PageHeap选项。

Pageheap.exe

- PageHeap配置工具,在Windows 2000 Professional SP2 以上可用。已经被GFlags取代。

GFlags

-老牌的PageHeap配置工具,有命令行和GUI两种操作方式,功能比较全,包含在Windbg调试器安装包内。同样在Windows 2000 Professional SP2 以上可用。

AppVerifier

-新的PageHeap配置工具,需要XP系统才支持。VS2005内置了AppVerifier,支持,用“Debug”菜单—〉“Start With Application Verifier”启动程序,会自动启动Page Heap。下载:http://www.microsoft.com/downloads/details.aspx?FamilyID=bd02c19c-1250-433c-8c1b-2619bd93b3a2&displaylang=en#filelist

一些使用GFlags命令行的例子:

配置正常页堆:

"C:\Program Files\Debugging Tools for Windows (x86)\gflags.exe" /p /enable qq.exe

配置完全页堆:

"C:\Program Files\Debugging Tools for Windows (x86)\gflags.exe" /p /enable qq.exe /full

列出当前启动了页堆的进程列表:

"C:\Program Files\Debugging Tools for Windows (x86)\gflags.exe" /p

取消页堆设置:

"C:\Program Files\Debugging Tools for Windows (x86)\gflags.exe" /p /disable qq.exe

一定需要这些工具吗?

正如前面提到的,PageHeap属于操作系统提供的功能,这几个工具只是方便修改注册表中的选项,在实际应用中可以通过直接修改注册表来启用PageHeap。这在客户的机器上很有用,不再要求客户去安装这些软件。

一些特殊选项解释:

/unaligned

这个选项只能用于完全页堆。当我们从普通堆管理器分配一块内存时,内存总是8字节对齐的,页堆默认情况下也会使用这个对齐规则,但是这会导致分配的内存块的结尾不能跟页边界精确对齐,可能存在0-7个字节的间隙,显然,对位于间隙范围内的访问是不会被立即发现。更准确的说,读操作将永远不能被发现,写操作则要等到内存块释放时校验间隙空间内的填充信息时才发现。/unaligned用于修正这个缺陷,它指定页堆管理器不必遵守8字节对齐规则,保证内存块尾部精确对齐页边界。

需要注意的是,一些程序启用这个选项可能出现异常,例如IE和QQ就不支持。

/backwards

这个选项只能用于完全页堆。这个选项使得分配的内存块头部与页边界对齐(而不是尾部与边界对齐),通过这个选项来检查头部的访问越界。

/debug

指定一启动进程即Attach到调试器,对于那些不能自动生成dump的程序,是比较有用的选项。

页堆能校验的有效范围

所有内存分配函数,只要最终调用到ntdll.Dll堆管理函数(即RtlAllocateHeap,RtlFreeHeap),页堆都是有效的。具体包括:

诸如 HeapAlloc、HeapFree、HeapReAlloc、LocalAlloc、LocalFree、LocalReAlloc 等等Kernel32提供的堆管理函数。

CRT内存分配如:malloc、free、realloc、msize、expand、运算符 new、delete、new[ ]、delete[ ]等等。

但页堆不能用于验证虚拟内存分配函数如:VirtualAlloc、VirtualFree等分配的内存块。

页堆能处理的错误类型:

错误类型                                                 正常页堆                                整页堆

堆句柄无效                                             立即发现                                立即发现

堆内存块指针无效                                 立即发现                                立即发现

多线程访问堆不同步                             立即发现                                立即发现

假设重新分配返回相同地址(realloc)   90% 内存释放后发现            90% 立即发现

内存块重复释放                                     90% 立即发现                       90% 立即发现

访问已释放的内存块                             90% 在实际释放后发现       90% 立即发现

访问块结尾之后的内容                         在释放后发现                       立即发现

访问块开始之前的内容                      在释放后发现                       立即发现

gflags 调试内存_gflags 检查内存越界 | 学步园相关推荐

  1. vs调试c语言检查内存泄露,VisualStudio中检查内存泄露方法

    项目工程中存在内存泄露,被折磨了一晚上,终于查了出来,因为之前没有相关的经验,还比较生疏,在此记录下来,方便以后查找. 对于malloc出的内存的检测方法 这篇文章中详细地记录了从检查到找到确定位置到 ...

  2. 使用PageHeap.EXE或GFlags.EXE检查内存越界错误 (转)

    2011-05-27 20:19 290人阅读 评论(0) 收藏 举报 microsoftdebuggingstructureoutputimagefile 必先利其器之一:使用PageHeap.EX ...

  3. 【调试手段】linux下valgrind内存泄露检查

    参考文章:http://blog.csdn.net/wzzfeitian/article/details/8567030 文库资料:                                   ...

  4. 在Ubuntu 14.04 64bit上安装Valgrind并检查内存泄露

    valgrind官网:http://valgrind.org/ 1.安装方法 第一种方式:下载目前最新的源码,编译安装,在服务器上推荐这种方式 wget http://valgrind.org/dow ...

  5. linux c 内存泄露 检查工具

    Linux下编写C或者C++程序,有很多工具,但是主要编译器仍然是gcc和g++.最近用到STL中的List编程,为了检测写的代码是否会发现内存泄漏,了解了一下相关的知识. 所有使用动态内存分配(dy ...

  6. Linux下几款C++程序中的内存泄露检查工具

    Linux下编写C或者C++程序,有很多工具,但是主要编译器仍然是gcc和g++.最近用到STL中的List编程,为了检测写的代码是否会发现内存泄露,了解了一下相关的知识. 所有使用动态内存分配(dy ...

  7. Linux 下几款程序内存泄漏检查工具

    Linux 下几款程序内存泄漏检查工具 chenyoubing | 发布于 2016-07-23 10:08:09 | 阅读量 93 | 无 写这篇博客的原因呢是因为自己在编写基于Nginx磁盘缓存管 ...

  8. 【内存检测系列】window下windbg内存泄漏检查

    文章目录 1.使用windbg中的umdh检查 1.1. 工具下载 1.2.环境配置 1.3.利用工具umdh(user-mode dump heap)分析 1.4.利用umdh创建heap快照 2. ...

  9. securecrt遇到一个致命的错误且必须关闭_高性能服务器之路 | 浅谈 Valgrind 内存错误检查神器 Memcheck...

    本文是 高性能服务器开发 第一篇 导读 Memcheck 可以检查哪些内存错误? 使用 Memcheck 解决问题的原则 原则 1,内存非法读写错误一定要解决 原则 2,变量未初始化错误一定要解决 原 ...

  10. 常用的内存泄漏检查工具

    以下是一些常用的内存泄漏检查工具: 1. Valgrind:Valgrind是一种开源的内存调试和性能分析工具,可以检测内存泄漏.使用未初始化的内存.使用已释放的内存等问题. 2. AddressSa ...

最新文章

  1. 解决: AttributeError: module 'cv2' has no attribute 'SURF'
  2. VTK:图片之ImageNonMaximumSuppression
  3. 【机器学习】传统目标检测算法之级联分类器Cascade
  4. python进阶之学习笔记_干货 | Python进阶系列之学习笔记(四)
  5. 产品经理有话说!这个报表神器更新了6大功能,绝对亮眼
  6. Web Dev领域:2017精彩事件和 2018预测
  7. 不必害怕人工智能,它会让我们变成“超人”
  8. 七牛云智能日志管理平台的应用与设计
  9. 泛型编程 - 学习/实践
  10. IOS越狱运行Linux,iOS 13.4.1 Linux 简易越狱,重启就能打开
  11. 跳棋编程c语言代码,跳棋游戏C语言程序设计(数据结构课程设计).doc
  12. 解决ZeroDivisionError: integer division or modulo by zero问题
  13. 计算机领域顶级期刊是什么,喜报 | 我所一篇论文被计算机领域顶级期刊TKDE录用...
  14. 今日份安利:视频变声的软件有哪些?
  15. 在c语言程序中main函数的位置,在C语言程序中,main函数的位置_________。
  16. C++ 多线程——pthread_cancel 取消线程的疑惑
  17. SPAC第一家“吃螃蟹”的公司来了,港股等待“化学反应”?
  18. 雷达导引头伺服系统的建模与仿真
  19. linux 文件 图标 覆盖,在Deepin下处理Microsoft Edge替换图标及替换文件
  20. OpenWrt固件编译

热门文章

  1. kvaser canking 的使用
  2. ajhua门禁_大华门禁主机密码 ajhua门禁
  3. EndNote X9破解之后遇到的问题
  4. dorado 7 注意总结
  5. C/S权限系统得到拼音和五笔的自定义函数(二)
  6. 百度云大文件高速下载方法、软件
  7. 支付宝微信QQ钱包收款码合并教程及源码下载
  8. http-server介绍及使用
  9. Markdown下载地址
  10. 无线ac配置dhcp服务器,华硕RT-AC86U路由器怎么设置DHCP功能