Delphi应用程序的调试(六)步进式代码调试
步进式代码调试(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任务栏上的按钮)。
步进式代码调试是一个基本的调试技术,用户在调试程序时要经常使用这一技术,因此用户要记住有关的键盘快捷键:
【F7】Trace Into
【F8】 Step Over
【F9】 Run
Delphi应用程序的调试(六)步进式代码调试的更多相关文章
- delphi xe4 程序添加管理员权限要求后不能调试的解决方法
环境: win7 企业版 xe4 问题: 把项目设置为需要管理员权限才能运行后,调试会弹出一个提示框,如图:
- alert一般用来调试客户端的javascript代码,以及更好的调试方法
alert一般用来调试客户端的javascript代码 调试利器--console.log 如今主流浏览器(Chrome,IE8及后续版本,FireFox,Opera等)都支持控制台功能. Chrom ...
- Delphi应用程序的调试(十)调试器选项(在IDE中不要使用异常)
可在两个级别上设置调试选项:工程级和环境级.在前面的讲解中讲解了工程级调试选项,通过主菜单[Project | Options…]打开如下对话框: 可在Debugger Options对话框中设置全局 ...
- Delphi应用程序的调试(十)调试器选项
可在两个级别上设置调试选项:工程级和环境级.在前面的讲解中讲解了工程级调试选项,通过主菜单[Project | Options…]打开如下对话框: 可在Debugger Options对话框中设置全局 ...
- Delphi应用程序的调试(五)其他调试工具
Delphi应用程序的调试(五)其他调试工具 Delphi7中提供了一些附加调试工具来帮助用户检查程序错误.从性能上讲,其中一些工具属于高级调试工具.尽管高级调试工具不像其他工具那样常用,但对于经验丰 ...
- Delphi应用程序的调试(二)使用断点
Delphi应用程序的调试(二)使用断点 使用断点(Using Breakpoints) 当用户从Delphi IDE 运行程序时,程序全速运行,只会在设置了断点的地方停住. New Term 断点( ...
- Delphi应用程序的调试(一)
集成式调试器是Delphi IDE的一个重要特性.该调试器使用户能方便地设置断点.监视变量.检查对象等等.在运行程序时,使用该调试器能快速查找出程序发生了什么(或未发生什么).一个号的调试器对程序开发 ...
- 64位内核开发第六讲,Windbg调试ring3跟Ring0.一起调试
目录 驱动第六讲_Windbg连续调试Ring3.与Ring0 一丶Windbg连调试 驱动第六讲_Windbg连续调试Ring3.与Ring0 一丶Windbg连调试 有时候我们调试一个程序.可以使 ...
- Web开发者的六个代码调试平台
代码调试平台是Web开发者进行开发.测试.分享.协作和交流的网络应用,它们支持实时的编辑.预览HTML.CSS和JavaScript的客户端代码.这些代码调试平台最值得称道的地方在于,它们中的大多数都 ...
随机推荐
- C#基础 ---------------单利模式
一.引言 最近在设计模式的一些内容,主要的参考书籍是<Head First 设计模式>,同时在学习过程中也查看了很多博客园中关于设计模式的一些文章的,在这里记录下我的一些学习笔记,一是为了 ...
- java EE 环境配置(JDK + Tomcat + Eclipse for java EE)
这学期的课程多数都是java语言的,像Java Web程序设计,java课程设计案例,所以趁周末先把软件,环境配置好. 下载JDK 先给上下载链接:http://www.oracle.com/tech ...
- php中的func_num_args、func_get_arg与func_get_args函数
From: http://www.cnblogs.com/xiaochaohuashengmi/archive/2011/09/21/2183157.html php的的func_num_args.f ...
- u3d一个GameObject绑定两个AudioSource
u3d 一个GameObject绑定两个AudioSource ,使他们分别播放,并控制 using UnityEngine; using System.Collections; public cl ...
- 4 Flask 命令行模式
preface 在Django中我们可以使用python manage.py shell进入 shell下面调试,在flask下面我们需要安装第三方模块来进入shell模式,安装的模块为Flask-S ...
- RancherOS(ROS)如何安装到硬盘? 并设置为用户自动登录到系统? -a rancher.autologin=tty1
RancherOS 安装到硬盘,一般都是通过ssh_authorized_keys 方式. ------------------------------------------- 从第一次认识到这个方 ...
- MYSQL列中的数据以逗号隔开,如何查询
FROM `task_detatils` WHERE FIND_IN_SET( '1', responsible_user) 将含有1的responsible_user列数据全部搜索出来
- Do you want a timeout?
Do you want a timeout? You’re feeling accomplished and excited; the new features for your applicat ...
- SpringMVC -- 梗概--源码--贰--拦截器:Interceptor
附:实体类 1.配置web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app versi ...
- InsertSql
declare @hobby table(hobbyID int,hName nvarchar(100));insert into @hobby(hobbyID,hName)Select 1,'爬山' ...
