步进式代码调试(Stepping Through Your Code)
步进式代码调试是最基本的调试操作之一,但仍要在此讲述。人们常常容易犯只见树木不见森林的错误。经常复习基本的知识有助于读者了解以前不知道的东西。
调试沟槽符号(Debugging Gutter Symbols)
在开始讲述之前,先要说说在调试会话期间出现在Code Editor沟槽中的符号。在之前的讲解中讲过,当用户在一个代码行上设置一个断点,沟槽中就会出现一个红色的圆圈。
沟槽中还有一个绿色箭头符号指示执行点所在位置。如下图:
有一点没有讲过,就是在沟槽中与某些代码行对应的位置上有一些蓝色小点。这些蓝点指示实际产生汇编代码的源代码。如下图,调试器停在一个断点处时的Code Editor。其中有指示产生汇编代码的源代码行的蓝色小点,也有指示执行点的箭头符号,还有断点符号。断点符号上的复选标志表示该断点是一个有效断点。
仔细观察上面的代码,不带小点的代码行不产生任何编译代码。例如上面的:
1
2
3
|
var S: string; X: Integer; |
为什么这几行不产生代码呢?因为它们是变量声明行。再看一行:
1
|
X := 20; |
为什么这一行不产生代码呢?这是因为代码优化的缘故。编译器在编译代码时会发现变量X未实际使用过,从而将它优化掉。再看下面几行:
1
2
3
|
{$IFNDEF WIN32} S := 'Something's very wrong here...'; {$ENDIF} |
编译器不会编译器伪指令之间的源代码行进行编译,因为符号WIN32定义在一个Delphi7的程序中。编译器伪指令{$IFNDEF WIN32}告诉编译器:如果目标平台不是32位Windows,就编译这一行。因为Delphi7是32位编译器,所以不编译这行代码。如果是在Delphi1(16位环境)中,这行源代码就要编译。
步进式调试与跟踪(Step Over and Trace Into)
好了,再回到“步进式调试代码”上来。当程序在断点处暂停时,用户可以做很多事情:在Watch List中设置要监视的变量,用Debug Inspector检查对象或查看调用栈。还可以步进式调试代码,当每一个代码行执行时,监视变量和对象的变化。
当继续步进式调试时,会看到源代码中下一步要执行的源代码以蓝色加亮显示。如下图:
如果打开了Watch List窗口和Debug Inspector窗口,它们就会随着每一代码的执行而被更新。在Watch List和Debug Inspector窗口中能立即看到变量和对象的变化。IDE调试器有两个主要步进命令:Step Over和Trace Into。
1、Step Over
Step Over是指执行一行源代码,并在其下一行暂停。“Step Over”在此有点用词不当,因为从字面上理解,是跳过一个源代码行的意思。但是,此处不能从字面上去理解Step Over。实际上,Step Over是指执行当前源代码行,如果该行代码调用了函数或过程,则所调用的函数或过程也要完整地执行完。例如,一个程序的某行代码调用一个方法,在该代码行上设置一个断点;当用调试器Step Over该行代码时,调试器将执行完所调用的方法并停在下一行代码上。
要用Step Over调试程序,可以按F8键,也可以从主菜单上选【Run | Step Over】,或从工具栏中选择。
Note
当用户步进式调试程序中的各个源代码单元时,Code Editor会自动装入并显示所需的源代码单元(如果这些单元还未打开)。
2、Trace Into
当用户在步进式调试代码过程中碰到函数或过程时,Trace Into命令允许用户跟踪该函数或过程的执行。Trace Into不是像Step Over那样执行完函数或过程后返回到下一行,而是将执行点放置到所调用函数或过程的第一行源代码上,然后用户可以使用Step Over或Trace Into来逐步步进调试该函数或过程。Trace Into的快捷键为F7。
当用户检查完变量以及做完其他要做的调试工作后,可点击Run按钮再运行该程序,程序将会正常运行,直至碰到下一个断点。
Note
如果用户有专业版Delphi或客户/服务器版Delphi,那就可以跟踪VCL源代码。当碰到一个VCL方法时,Trace Into允许用户进入该方法的VCL源代码,用户可查看任何需要查看的变量。必须将VCL源代码所在目录的路径添加到Project Options对话框(Directories/Conditionals页面)上的Search Path字段中,如下图:
OK确认之后要重新编译、链接。跟踪VCL源代码对大多数编程人员可能意思不大;但对于经验丰富的程序员,它是非常有用的。
3、Trace To Next Source Line
另外一个调试命令是“Trace To Next Source Line”快捷键是【Shift + F7】。可从主菜单选择【Run | Trace to Next Source Line】菜单项打开该命令。
用户不会频繁使用这个命令,特别是调试和Windows编程还不太熟悉的用户。有些Windows API函数使用回调函数,意思是指Windows函数调用用户的函数来执行一些操作。
如果执行点在一个Windows API函数上,而这个函数使用一个回调函数,则使用Trace to Next Source Line命令会跳过执行点到回调函数的第一行。其效果类似于Trace Into(但在某些特定情况下,两者的效果却又完全不同。)。
当步进式调试一个方法时,执行点最终要到达该方法的end语句。若所调试的方法在其运行结束后将控制权返回给Windows,则当执行点在方法的end语句时按F8键,可退出该方法并把控制返回给正调试的程序。此时不能确定程序会不会再暂停,因为IDE具有输入焦点。要切回到该程序,将其激活就可以了。(点击其在Windows任务栏上的按钮)。
步进式代码调试是一个基本的调试技术,用户在调试程序时要经常使用这一技术,因此用户要记住有关的键盘快捷键: