VC在Debug模式下的变量内存布局
来源:互联网 发布:如何成为淘宝粉丝 编辑:程序博客网 时间:2024/06/05 20:09
在VC的Debug模式下编译程序,编译器在内存处理中加入许多额外的代码以方便发现程序中可能出现的越界现象。先做个小测试,下面这个程序可以看到有个小越界。
void FMemoryAllocTest()
{
int x[4];
int y1, y2, y3;
x[0] = 0;
x[1] = 1;
x[2] = 2;
x[3] = 3;
x[4] = 4;
y1 = 5;
y2 = 6;
y3 = 7;
}
先看看进入函数时编译器作了什么工作。其中绿色部分是正常的初始化部分,而红色部分就是在Debug中的额外处理,它把函数栈从栈顶开始的一段内存全部填上0XCC。
void FMemoryAllocTest()
{
00411B10 push ebp
00411B11 mov ebp,esp
00411B13 sub esp,108h
00411B19 push ebx
00411B1A push esi
00411B1B push edi
00411B1C lea edi,[ebp-108h]
00411B22 mov ecx,42h
00411B27 mov eax,0CCCCCCCCh
00411B2C rep stos dword ptr es:[edi]
而当函数退出时,它会调用一个检查函数测试是否有内存越界。
}
00411B66 push edx
00411B67 mov ecx,ebp
00411B69 push eax
00411B6A lea edx,[ (411B80h)]
00411B70 call @ILT+145(@_RTC_CheckStackVars@8) (411096h)
00411B75 pop eax
00411B76 pop edx
00411B77 pop edi
00411B78 pop esi
00411B79 pop ebx
00411B7A mov esp,ebp
00411B7C pop ebp
00411B7D ret
现在再看看具体的变量在内存中的布局。下面是在我系统中的一个例子。其中红色部分是越界内存,绿色为变量位置。
0x0012FE10 cc cc cc cc cc cc cc cc 07 00 00 00 cc cc cc cc
0x0012FE20 cc cc cc cc 06 00 00 00 cc cc cc cc cc cc cc cc
0x0012FE30 05 00 00 00 cc cc cc cc cc cc cc cc 00 00 00 00
0x0012FE40 01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00
0x0012FE50 68 ff 12 00 03 36 41 00 00 00 00 00 9c f9 05 06
由上面内存可见,变量x,y1,y2,y3等的内存分布如下表。可见从变量的声明顺序,按照地址递减的顺序依次分配内存,而且每个变量都不是连续存在,而是被0xcc包围。这样如果我们在调试状态下察看内存内容,有经验的话可以幸运的发现是否有内存越界。或者,可以通过这一功能,开发特殊的工具来进行检测。
0x0012FE10
cc cc cc cc
cc cc cc cc
Y3
cc cc cc cc
0x0012FE20
cc cc cc cc
Y2
cc cc cc cc
cc cc cc cc
0x0012FE30
Y1
cc cc cc cc
cc cc cc cc
X[0]
0x0012FE40
X[1]
X[2]
X[3]
cc cc cc cc
0x0012FE50
EBP
Return address
…
…
函数退出时,编译器捕捉到了这一越界,弹出一个对话框:
- VC在Debug模式下的变量内存布局
- DEBUG模式下, 内存中的变量地址分析
- Static变量在Debug和Release模式下的初始化顺序偶有差异
- eclipse在debug模式下鼠标移动到变量上不显示值的问题
- eclipse在debug模式下鼠标移动到变量上不显示值的问题
- 内存中常见异常值的解释(比如0xcccccccc、0xcdcdcdcd和 0xfeeefeee 异常值)以及关于VC 中 debug和Release模式下的变量初始化问题
- vc socket在debug模式下可以正常通讯,在release模式下经常通讯失败
- 探讨C++ 变量生命周期、栈分配方式、类内存布局、Debug和Release程序的区别
- 一个简单的非模式对话框在VC下的内存泄漏!
- C++ 内存布局 变量在堆栈的分配
- Eclipse Debug模式下,当鼠标移动到变量时不显示变量的值
- 使用VC的DEBUG检查内存泄漏
- volatile在debug和release模式下的意义
- VS2005 在UNICODE模式下debug生成的程序出错
- opencv在debug模式下无法读入图像的问题
- IDEA在DEBUG模式下慢的问题
- 如何在debug模式下,使用正式的签名文件
- tomcat在debug模式下无法启动的解决办法
- 客户区和非客户区?窗口客户区和视图客户区?
- 生成随机数
- HTTP协议详解
- Linux常用命令汇总(不断更新)
- Sybase 中的替换函数
- VC在Debug模式下的变量内存布局
- 无题
- jquery二级树形菜单(test)
- Sql Server 2005如何自动备份数据库
- ODBC简介
- 探究Windows内核你知多少
- 创业公司如何用人
- 9i upgrade to 10g
- 定制IE下载对话框的按钮