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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值