在Delphi 7调试过程中查看内存
熟悉C语言的朋友在使用Delphi编程,尤其是通讯方面编程的时候,经常会习惯于直接在调试环境下查看某一段内存到底保存了什么值来确认代码中的问题出在什么地方。在Delphi中查看内存往往不像在C中那么直观。我将其使用的方法总结如下。 如果定义了一个PChar类型,并且使用GetMem为其分配了内存,想在调试环境下查看一下分配的内存的初始状态到底是什么样子,要怎么做呢? 首先,我们看下面的一段代码: 为了调试方便,我们将去掉Delphi编译器的优化选项,如下图所示: 在单步执行到如下语句的时候,我们检查变量Buf: 将鼠标光标停留在Buf上,我们得到一堆乱码, 使用Debug菜单的Inspect功能查看Buf变量,我们可以得到Buf变量的地址: $12F624 现在我们使用Debug菜单的查看内存功能来查看$12F624这个地址: 在下图中我们可以看到,现在这个地址保存的内容是$00403277. 实际上,PChar本身是一个类似C语言的地址类型,其中保存的是另外的一个地址,在下面的一个语句中新分配的内存的地址将被保存在这个变量中,我们执行完下一句语句以后再来检查这个地址的值,看看有什么变化: 随着GetMem语句的执行,Buf变量的值发生了变化,变成了一个有意义的地址:$00D53CEC,我们来检查一下这块内存现在的值,在左边的 内存检查窗口中点右键,选择 goto address,在弹出的对话框中输入$00D53CEC然后按确认键,结果如下图所示: 虽然你看到了无数的0,但是,因为我们要求分配的是200个字节,所以,有效范围内,有一块内存包含了字符串:comctl32.dll...,这 说明,GetMem函数并不会初始化新分配的内存,实际上新分配的内存可能包含任何数据,正如Delphi手册中所说的那样,如果在这里使用 AllocMem代替GetMem,这时候查看的内存有效范围内将全部是0,因为AllocMem将会对新分配的内存进行初始化的动作,有兴趣的朋友不妨 一试。 保持现在的这个窗口不变,我们按F8继续执行到下一个语句完成,然后重新检查这块内存的数据: 在执行完StrCopy以后,我们希望的字符串出现在了这块内存其实的地方,这个字符串并不像Delphi的String字符串那样,在前面有一个 整数保存长度,它正是C程序员已经很熟悉的Null Teminated字符串,这个字符串以"0结尾,并且"0后面的部分保存原样。 继续往下执行,在FreeMem语句执行完毕以后,我们看到变量Buf中仍然保存着前面的地址,并且这块地址对应的内存也仍然保持前面的内容,但是,这块内存现在已经被系统收回,并且可能在后续的GetMem或者AllocMem调用中被重新分配。 PChar其实和C语言的指针没有任何区别,但是在使用上却又和Pascal的char可以混用,所以是最容易混淆的地方。 |