关于mfc 中使用gflags检测内存越界的问题

下载windbg,安装目录下有gflags.exe,用它来配置完全页堆,首先命令行定位gflags.exe的目录,输入gflags.exe /p /enable xxx.exe /full /unaligned,说明使用完全页堆,且内存申请不对齐,保证只要一越界就可以检测出来。因为内存申请一般是会对齐的,例如8字节对齐,我new一个字节的内存,那么从这个字节打后7个字节我都是可以写入的,而程序运行起来不会报错,使用 /unaligned是保证不会出现上面说的这种情况。

实验中用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子项要删除,本人在实验中没有删除注册表的配置信息,再开机就蓝屏了,也不知道跟这个有没有关系。后来在“上一次正常配置”进了系统把注册表信息删除了就好了。

猜你喜欢

转载自blog.csdn.net/zhushentian/article/details/77417714
今日推荐