调试程序时,为什么内存代码段填充{烫烫烫烫烫烫烫烫烫烫}
2015-07-05 10:25
274 查看
在调试程序时,看变量值在内存中变化的时候,看到很多是0xCC,0xCC,0xCC,烫烫烫。
查了下为啥是烫烫烫烫烫烫烫烫烫烫,有相同疑惑的同学可以查考下。
0xCC:填充未初始化的栈变量(烫烫烫烫烫烫烫烫烫烫)
0xCD:填充从堆中申请的内存 (“葺葺葺葺葺葺葺葺葺葺”)
0xFEEE:已经释放的内存 (“铪铪铪铪铪铪铪铪铪铪铪”)
参考这段代码:
char stack_var[11];
stack_var [10] = 0;
cout<<"uninit stack memory"<<stack_var<<endl;
char* pheap = new char[11];
pheap[10] = 0;
cout<<"uninit heap memory"<<pheap<<endl;
char* pmalloc =(char*) malloc(11);
pmalloc[10]=0;
cout<<"uninit malloc memory"<<pheap<<endl;
free(pmalloc);
cout<<"free heap memory"<<pheap<<endl;
delete[] pheap;
cout<<"delete heap memory"<<pheap<<endl;
会有如下输出:
uninit stack memory烫烫烫烫烫
uninit heap memory屯屯屯屯屯
uninit malloc memory屯屯屯屯屯
free heap memory屯屯屯屯屯
cout<<"delete heap memory"<<pheap<<endl; 由于debug模式保护原因会中断 但内存确实是0xFEEE "铪铪"
可见 delete 比 free做了更多的工作 会标记释放的内存 相对更安全
CC是int 3h的机器码,这是一个中断指令.debug版本的内存中填充这个指令就是让程序出现错误的时候(非法跳转)能停下来.方便调试.
你很烫吗?我很烫!
相信经常用VC的朋友对屏幕输出的一大堆“烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫”不会陌生,但是也许会很奇怪,为什么会出现“烫”字呢?莫非改程序导致系统运行缓慢,发热过高???非也!下面让我解释一下吧,有错误的地方请指正:
我们逆向了Debug模式下的一个C程序,发现栈区开辟的存储空间都是使用0CCCCCCCCh来填充4字节单位的,也就是说,栈区开辟的存取局部变量的空间的每一个字节都被0xCC填充了。(为什么用0xCC,这个是int 3h的机器码,下断点用的)两个0xCC合起来输出时恰好对应中文“烫”字。
这也就不奇怪程序输出那么多“烫”了。
实例一:
实例二:
实例三:把字符数组定义为全局变量
这次系统输出了空,没有烫了!为什么,请读者自己思考。
其实,全局变量分配在”全局/静态存储区“中,局部变量分配在栈中,我们可以定义一个很大的数组,如果是局部的,会导致程序栈溢出,因为栈的空间大小是有限制的;而全局的则不会。
另外需要注意,这些”烫烫烫烫烫烫烫“现象只会在Debug模式中出现,在Release模式中不会出现。
如果你对”烫烫烫烫烫烫烫“表示很熟悉,那么”屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯“你见过吗?应该吧。我本人以前经常遇到”烫“,但很少遇到后者。
实例四:动态分配内存空间
运行程序,顿时满屏的”屯“字出现在眼前,有图有真相:
因为,动态分配的空间开辟与堆,VC的Debug用0xCD填充堆的空间,两个0xCD和在一起就是屯了。
查了下为啥是烫烫烫烫烫烫烫烫烫烫,有相同疑惑的同学可以查考下。
0xCC:填充未初始化的栈变量(烫烫烫烫烫烫烫烫烫烫)
0xCD:填充从堆中申请的内存 (“葺葺葺葺葺葺葺葺葺葺”)
0xFEEE:已经释放的内存 (“铪铪铪铪铪铪铪铪铪铪铪”)
参考这段代码:
char stack_var[11];
stack_var [10] = 0;
cout<<"uninit stack memory"<<stack_var<<endl;
char* pheap = new char[11];
pheap[10] = 0;
cout<<"uninit heap memory"<<pheap<<endl;
char* pmalloc =(char*) malloc(11);
pmalloc[10]=0;
cout<<"uninit malloc memory"<<pheap<<endl;
free(pmalloc);
cout<<"free heap memory"<<pheap<<endl;
delete[] pheap;
cout<<"delete heap memory"<<pheap<<endl;
会有如下输出:
uninit stack memory烫烫烫烫烫
uninit heap memory屯屯屯屯屯
uninit malloc memory屯屯屯屯屯
free heap memory屯屯屯屯屯
cout<<"delete heap memory"<<pheap<<endl; 由于debug模式保护原因会中断 但内存确实是0xFEEE "铪铪"
可见 delete 比 free做了更多的工作 会标记释放的内存 相对更安全
CC是int 3h的机器码,这是一个中断指令.debug版本的内存中填充这个指令就是让程序出现错误的时候(非法跳转)能停下来.方便调试.
你很烫吗?我很烫!
相信经常用VC的朋友对屏幕输出的一大堆“烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫”不会陌生,但是也许会很奇怪,为什么会出现“烫”字呢?莫非改程序导致系统运行缓慢,发热过高???非也!下面让我解释一下吧,有错误的地方请指正:
我们逆向了Debug模式下的一个C程序,发现栈区开辟的存储空间都是使用0CCCCCCCCh来填充4字节单位的,也就是说,栈区开辟的存取局部变量的空间的每一个字节都被0xCC填充了。(为什么用0xCC,这个是int 3h的机器码,下断点用的)两个0xCC合起来输出时恰好对应中文“烫”字。
这也就不奇怪程序输出那么多“烫”了。
实例一:
<span style="font-size:14px;">// 如果不建立工程,请大家自己修改一下头文件 #include "stdafx.h" #include <string.h> int _tmain(int argc, _TCHAR* argv[]) { char s[256] = {0}; // 定义一个数组 memset(s, 0xCC, sizeof(s)); // 用0xCC填充 printf("%s\n", s); // 输出 return 1; }</span>
实例二:
<span style="font-size:14px;">// 如果不建立工程,请大家自己修改一下头文件 #include "stdafx.h" #include <string.h> int _tmain(int argc, _TCHAR* argv[]) { char s[256]; // 系统默认用0xCC填充 printf("%s\n", s); // 输出 return 1; }</span>程序输出还是”很烫“。
实例三:把字符数组定义为全局变量
<span style="font-size:14px;">// 如果不建立工程,请大家自己修改一下头文件 #include "stdafx.h" #include <string.h> char s[256]; // 全局变量 int _tmain(int arg 4000 c, _TCHAR* argv[]) { printf("%s\n", s); // 输出 return 1; }</span>
这次系统输出了空,没有烫了!为什么,请读者自己思考。
其实,全局变量分配在”全局/静态存储区“中,局部变量分配在栈中,我们可以定义一个很大的数组,如果是局部的,会导致程序栈溢出,因为栈的空间大小是有限制的;而全局的则不会。
另外需要注意,这些”烫烫烫烫烫烫烫“现象只会在Debug模式中出现,在Release模式中不会出现。
如果你对”烫烫烫烫烫烫烫“表示很熟悉,那么”屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯“你见过吗?应该吧。我本人以前经常遇到”烫“,但很少遇到后者。
实例四:动态分配内存空间
<span style="font-size:14px;">// 如果不建立工程,请大家自己修改一下头文件 #include "stdafx.h" #include <stdio.h> #include <stdlib.h> int main(int argc, char* argv[]) { char *s = (char *)malloc(sizeof(char) * 256); puts(s); free(s); return 0; }</span>
运行程序,顿时满屏的”屯“字出现在眼前,有图有真相:
因为,动态分配的空间开辟与堆,VC的Debug用0xCD填充堆的空间,两个0xCD和在一起就是屯了。
相关文章推荐
- Linux 自检和 SystemTap
- Python 七步捉虫法
- IE7降低内存和降低CPU的几个技巧
- 路由器的配置与调试
- 如何高效的使用内存
- DOS下内存的配置
- 对于技术人员的出现了运行时间错误,是否要进行调试的解决方法
- XP/win2003下发现1G的内存比512M还慢的解决方法
- PowerShell实现动态获取当前脚本运行时消耗的内存
- C#实现把dgv里的数据完整的复制到一张内存表的方法
- C语言内存对齐实例详解
- 全局变量与局部变量在内存中的区别详细解析
- VB读取线程、句柄及写入内存的API代码实例
- php运行提示:Fatal error Allowed memory size内存不足的解决方法
- IE浏览器IFrame对象内存不释放问题解决方法
- C#之CLR内存深入分析
- JavaScript 变量、作用域及内存
- 可以用来调试JavaScript错误的解决方案
- 如何调试异步加载页面里包含的js文件
- JavaScript避免内存泄露及内存管理技巧