(转载)有关win32平台下调试堆的描述(Win32 Debug CRT Heap) (实战篇)

此篇文章转载自RasAsm吧主的一篇技巧性文章,刚好弥补了上述知识所欠缺的实践部分:

http://tieba.baidu.com/p/1945193319

 

//************************************************************** 
//malloc错误使用的调试
//环境:VC6.0 XP SP3 
//作者:bingghost 
//邮箱:bingghost@gmail.com 
//版权所有,转载是请注明出处
//**************************************************************

学c的童鞋们经常都会用到malloc, 申请 释放的代码写的不规范,就很容易产生内存的非法访问,那么当我们代码写了很多行之后又该如何去调试并发现错误呢?
下面以VC环境为例.....


(1)首先构造代码如下,假定每行中间代码很多


假定代码多到你无法在短时间用肉眼看出来.......

(2)
编译连接如上代码,运行出错



(3)
重试”,在点取消进入调试模式
或者下断点后 调试运行



(4).查看栈窗口,回溯到上个窗口,发现代码报错地点



(5).看到free估计psz是一个堆指针,观察其堆结构


发现堆结构被破坏

(6).所以现在要开始找,到底是谁破坏了堆结构 
转到psz定义的地方(VC助手快捷键 Alt + G)



(7)对其下内存写入断点 
方法 Edit->Breakpoint->Data



(8)F5运行,程序断下来





(9).观察代码和内存值---发现里面刚刚存入堆的地址

 

(10),查看堆结构,发现并未被破坏



(11)用上面同样的方式下内存写入断点,这个时候注意 是对下溢标记下断点



(12).程序成功断下来 ,发现断在汇编窗口里面了




(13)回溯栈窗口,找到出错点,发现是其长度不够,导致的堆下溢



(14)修改代码,程序成功执行 



(15).总结: 
类似的内存访问错误,均可采用此手法找错

posted on 2012-10-27 09:51  coolhysteria  阅读(558)  评论(0编辑  收藏  举报

导航