当前位置:C++技术网 > 资讯 > 内存错误访问检测工具gflag使用方法介绍

内存错误访问检测工具gflag使用方法介绍

更新时间:2015-06-26 14:23:49浏览次数:1+次

    在编写代码时,有时候会出现内存访问越界,导致堆栈被破坏,可能当时破坏并没有表现出来,然而破坏堆栈后,在后面使用堆栈时检测到堆栈被破坏,从而崩溃。这样我们在定位错误的时候,是很难定位的。因为堆栈破坏会让后面很多操作都会引起崩溃,而真正崩溃的并不是你操作的位置,从而给定位Bug造成了很大的麻烦。
     在介绍这个工具之前,先说明一下。内存检测只是帮助我们快速及时的发现问题的工具而已,并不是万能的。还有,检测到的错误的位置,也不是百分百准确,只能说是与真正的Bug的位置很接近,还需要自己慢慢找找。因为网上一些资料对gflag介绍的不清楚,也不是入门的,就连使用这个工具都讲的不清楚,所以,就整理一篇入门新手使用的方法。
     首先,我们要下载一个gflag.exe【点此下载】文件。这个文件下载后,放到系统的system32目录下。假如你的系统安装在C盘,那么就放在【C:\Windows\System32\】目录下即可,如果状态其他盘,改一下C即可。
     这样就不用设置什么乱七八糟的路径了。不要把这个复杂化,就手动放到这个目录就轻松搞定。不管是对于新手还是老手,都是很轻松的事情。
     然后,我们要使用DOS命令行开启检测功能。因为gflag.exe是放入了系统目录中,因此自然就在系统的搜索路径中的,所以,在命令行中,直接就可以使用gflag命令了。开启DOS界面,输入【gflags /p /enable test.exe /full】回车,提示:

path: SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options
     test.exe: page heap enabled

 下面是截图:



     就表示对test.exe的堆和栈检测功能启动了。如果要关闭检测,输入【gflags /p /disable test.exe /full】即可。
     这里对这几个命令参数说明一下。gflags就代表你放在系统目录下的EXE,系统会调用这个程序,在DOS就表现为一个命令。输入【gflag ?】就可以列出所有参数,并有功能说明。

/p:可以列出已经被检测跟踪的exe信息列表。
/enable:开启对指定的exe的检测跟踪。
/disable:取消对指定的exe的检测跟踪。
test.exe:这里只要给出你要运行的exe的文件名就行了,不用写出全路径。
/full:完整页堆模式。如果不加,就是正常页堆模式,其实就是如何来进行内存检测的方式而已。

下面给出两种页堆的运行方式:
 完全页堆:
        当分配一块内存时,通过调整内存块的分配位置,使其结尾恰好与系统分页边界对齐,然后在边界处再多分配一个不可访问的页作为保护区域。这样,一旦出现内存读/写越界时,进程就会Crash,从而帮助及时检查内存越界。
        因为每次分配的内存都要以这种形式布局,尤其对于小片的内存分配,即使分配一个字节,也要分配一个内存页,和一个保留的虚拟内存页(注意在目前的实现中,这个用作边界保护区域的页从来不会被提交)。这就需要大量的内存,到底一个进程需要多少内存,很难估算,因此在使用Page Heap前,至少保证你的机器至少设置了1G虚拟内存以上。
 正常页堆:
        正常页堆原理与CRT调试内存分配函数类似,通过分配少量的填充信息,在释放内存块时检查填充区域。来检测内存是否被损坏,此方法的优点是极大的减少了内存耗用量。缺点是只能在释放块时检测,不太好跟踪出错的代码位置。

    这样就可以了。然后,调试程序还是和平常一样调试。启动这个内存检测,就是帮助你快速尽早的确定内存中哪些位置出了问题。gflag本身并不对你的程序和项目做任何操作,只是对EXE使用的内存进行检测罢了。将不归EXE的内存但是相邻与EXE的内存设置不可用的内存标志。一旦你的程序中出现越界,就自然访问了带有不可访问内存标志的内存,从而调试器就崩溃了。这个是辅助调试器发现问题的工具,推荐每个程序员都要学会使用,其实用起来也是很简单的,是吧。