赞
踩
http://www.cnblogs.com/pugang/archive/2012/06/02/2531600.html
首先解释一下,什么是堆内存?
堆是一种常见的内存管理器,应用程序通过堆来动态地分配和释放内存,通常使用堆的情况是无法预先知道所需要的内存大小,或者申请内存太大,无法通过栈内存来自动分配,下面让我们再来看一段英文解释。
A heap is a form of memory manager that an application can use when it needs to allocate and free memory dynamically. Common situations that call for the use of a heap are when the size of the memory needed is not known ahead of time and the size of the memory is too large to neatly fit on the stack (automatic memory).
常见的情况是由于效率或特殊需求一个进程中同时使用几个堆,如下图:
下面通过一个完整的demo来带大家调试一个对破坏问题,demo代码如下:
在应用程序验证器下启用普通页堆,配置gflags, 运行build出来的代码,
输入参数为:SolidmangoSolidmangoSolidmango
得到如下输出:
我们会看到一个访问违例, 继续运行得到如下输出,说明应用程序验证器验证成功:
继续调试,此时我们已经找到了出问题的堆快,注意观察上面的输出中有这样一条语句:
001E2B60 : Heap block involved in the operation,好的,让我们看看这个堆块里面是什么东西,
总结:
原来是我们的参数破坏了了堆内存,终于找到了根源,我们代码中定义的堆的大小为10,而我们使用的时候,由于堆块越界,破坏了堆块的完整性,从而导致了crash的发生..
注:本文的附图和代码灵感源自网络,具体出处不详,其他内容为原创.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。