关于mfc 中使用gflags检测内存越界的问题
2017-08-19 22:21
323 查看
下载windbg,安装目录下有gflags.exe,用它来配置完全页堆,首先命令行定位gflags.exe的目录,输入gflags.exe /p /enable xxx.exe /full /unaligned,说明使用完全页堆,且内存申请不对齐,保证只要一越界就可以检测出来。因为内存申请一般是会对齐的,例如8字节对齐,我new一个字节的内存,那么从这个字节打后7个字节我都是可以写入的,而程序运行起来不会报错,使用 /unaligned是保证不会出现上面说的这种情况。
实验中用VS2008写了一个mfc程序,测试代码如下:
在i = 10时,写入越界了。
编译成Release版本(Debug版本貌似检测不出来),用gflags配置了完全页堆后,在VS中运行程序却发现崩溃在了Cheap_TestApp theApp;这句中,如果不加/unaligned的话就能运行程序,但是却检测不出写入越界。后来尝试:在项目属性里配置“在静态库中使用MFC”,同时在C/C++属性页的代码生成项的运行库子项改为多线程调试MT,就可以运行且能在越界的地方中断了。
需要注意的是,完成调试后,要恢复原来的配置:命令行到windbg的安装目录,输入gflags.exe /p /disable xxx.exe。可以使用gflags.exe /p 来查看当下有哪些程序被gflags配置着。在注册表里:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options 下面的xxx.exe子项要删除,本人在实验中没有删除注册表的配置信息,再开机就蓝屏了,也不知道跟这个有没有关系。后来在“上一次正常配置”进了系统把注册表信息删除了就好了。
实验中用VS2008写了一个mfc程序,测试代码如下:
int i = 0; char *pptr = new char[10]; for (int i = 0; i <11;i++) { pptr[i] = 0; }
在i = 10时,写入越界了。
编译成Release版本(Debug版本貌似检测不出来),用gflags配置了完全页堆后,在VS中运行程序却发现崩溃在了Cheap_TestApp theApp;这句中,如果不加/unaligned的话就能运行程序,但是却检测不出写入越界。后来尝试:在项目属性里配置“在静态库中使用MFC”,同时在C/C++属性页的代码生成项的运行库子项改为多线程调试MT,就可以运行且能在越界的地方中断了。
需要注意的是,完成调试后,要恢复原来的配置:命令行到windbg的安装目录,输入gflags.exe /p /disable xxx.exe。可以使用gflags.exe /p 来查看当下有哪些程序被gflags配置着。在注册表里:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options 下面的xxx.exe子项要删除,本人在实验中没有删除注册表的配置信息,再开机就蓝屏了,也不知道跟这个有没有关系。后来在“上一次正常配置”进了系统把注册表信息删除了就好了。
相关文章推荐
- 关于 MFC 绘制 JPG图像 问题 -- 无敌使用fread 获取图像到内存中
- 使用GFlags检测内存越界访问
- ACE 与MFC 混合使用 内存泄露问题
- 关于在VS2008以下版本的MFC程序使用VS 2008 FeaturePack出现内存泄露的理解
- 关于WD IFbA(Interactive Form by Adobe)的内存使用量问题
- 【原】使用Gflags来检测heap问题
- 关于xp使用4G内存的问题
- 使用PageHeap.EXE或GFlags.EXE检查内存越界错误
- 浅谈MFC内存泄露检测及内存越界访问保护机制
- 使用instrument检测ios程序内存问题
- 关于安装IE8之后VS2008使用MFC出现问题的解决方法
- GFlags 检查内存越界、野指针等作用的工具使用
- 关于SQL SERVER的内存使用的问题
- 关于内存问题和使用内存建议
- 使用Gflags来检测heap问题
- 浅谈MFC内存泄露检测及内存越界访问保护机制
- 使用PageHeap.EXE或GFlags.EXE检查内存越界错误
- 使用valgrind检测内存泄露的问题。
- 关于android中使用new Message的内存泄露问题
- 关于win32程序如何使用mfcdll的问题.