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

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

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

 

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

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


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

(转载)有关win32平台下调试堆的描述(Win32 Debug CRT Heap) (实战篇)_第1张图片


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

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

(转载)有关win32平台下调试堆的描述(Win32 Debug CRT Heap) (实战篇)_第2张图片



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

(转载)有关win32平台下调试堆的描述(Win32 Debug CRT Heap) (实战篇)_第3张图片



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

(转载)有关win32平台下调试堆的描述(Win32 Debug CRT Heap) (实战篇)_第4张图片



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

(转载)有关win32平台下调试堆的描述(Win32 Debug CRT Heap) (实战篇)_第5张图片


发现堆结构被破坏

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

(转载)有关win32平台下调试堆的描述(Win32 Debug CRT Heap) (实战篇)_第6张图片



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

(转载)有关win32平台下调试堆的描述(Win32 Debug CRT Heap) (实战篇)_第7张图片



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

(转载)有关win32平台下调试堆的描述(Win32 Debug CRT Heap) (实战篇)_第8张图片





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

(转载)有关win32平台下调试堆的描述(Win32 Debug CRT Heap) (实战篇)_第9张图片

 

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

(转载)有关win32平台下调试堆的描述(Win32 Debug CRT Heap) (实战篇)_第10张图片



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

(转载)有关win32平台下调试堆的描述(Win32 Debug CRT Heap) (实战篇)_第11张图片



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

(转载)有关win32平台下调试堆的描述(Win32 Debug CRT Heap) (实战篇)_第12张图片




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

(转载)有关win32平台下调试堆的描述(Win32 Debug CRT Heap) (实战篇)_第13张图片



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

(转载)有关win32平台下调试堆的描述(Win32 Debug CRT Heap) (实战篇)_第14张图片



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

你可能感兴趣的:(软件调试)