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的客户端代码.这些代码调试平台最值得称道的地方在于,它们中的大多数都 ...
随机推荐
- 一个 JAR 文件可以用于
用于发布和使用类库 作为应用程序和扩展的构建单元 作为组件.applet 或者插件程序的部署单位 用于打包与组件相关联的辅助资源 package Com.Table; import java.util ...
- webpy 使用python3开发
由于做服务器时总是需要调式与客户端的各种协议,由于种种原因客户端总是滞后的.所以一直想做个协议调试工具.postman是一个好东西,不过如果前后协议之间有关联,就不是很好用了. 之前用python写过 ...
- Ubuntu 12.04安装Java开发环境(jdk1.7 + Eclipse)
首先,去官网下载linux版本的jdk和eclipse tar包,并将其解压出来.我将jdk包发在了/usr/java/目录下,eclipse放在了/opt/目录下. 然后,配置java开发环境,即安 ...
- Linux系统date时间设定
修改linux系统的时间EDT和EST为CST EDT:指美国东部夏令时间 EST:英国时间 CST:北京时间 那么现在只要改成北京时间的时区CST就可以了,修改如下: [root@localhost ...
- 消息队列之 RabbitMQ
https://www.jianshu.com/p/79ca08116d57 关于消息队列,从前年开始断断续续看了些资料,想写很久了,但一直没腾出空,近来分别碰到几个朋友聊这块的技术选型,是时候把这块 ...
- jsTree 插件Ajax数据
完整代码 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta ...
- Backlight当前行背景高亮显示
下载地址:https://github.com/limejelly/Backlight-for-XCode PS:Xcode 8.0 默认支持了 跟VVDocumenter规范注释生成器的安装方式一样 ...
- SharePoint PowerShell创建一个GUID
在编辑SharePoint后台XML架构时常需要在ID属性上填写一个GUID (Globally Unique Identifiers 全局唯一标识的简称): 我们可以打开SharePoint管理控制 ...
- Mongodb数据结构及与MySql对比
MySql一直是性价比最高的关系型数据库典范 MongoDB带来了关系数据库以外的NoSql体验. 让我们看一个简单的例子,我们将如何为MySQL(或任何关系数据库)和MongoDB中创建一个数据结构 ...
- python mysql 封装
封装 观察前面的文件发现,除了sql语句及参数不同,其它语句都是一样的 创建MysqlHelper.py文件,定义类 #encoding=utf8 import MySQLdb class Mysql ...
