步进式代码调试(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应用程序的调试(六)步进式代码调试的更多相关文章

  1. delphi xe4 程序添加管理员权限要求后不能调试的解决方法

    环境: win7 企业版 xe4 问题: 把项目设置为需要管理员权限才能运行后,调试会弹出一个提示框,如图:

  2. alert一般用来调试客户端的javascript代码,以及更好的调试方法

    alert一般用来调试客户端的javascript代码 调试利器--console.log 如今主流浏览器(Chrome,IE8及后续版本,FireFox,Opera等)都支持控制台功能. Chrom ...

  3. Delphi应用程序的调试(十)调试器选项(在IDE中不要使用异常)

    可在两个级别上设置调试选项:工程级和环境级.在前面的讲解中讲解了工程级调试选项,通过主菜单[Project | Options…]打开如下对话框: 可在Debugger Options对话框中设置全局 ...

  4. Delphi应用程序的调试(十)调试器选项

    可在两个级别上设置调试选项:工程级和环境级.在前面的讲解中讲解了工程级调试选项,通过主菜单[Project | Options…]打开如下对话框: 可在Debugger Options对话框中设置全局 ...

  5. Delphi应用程序的调试(五)其他调试工具

    Delphi应用程序的调试(五)其他调试工具 Delphi7中提供了一些附加调试工具来帮助用户检查程序错误.从性能上讲,其中一些工具属于高级调试工具.尽管高级调试工具不像其他工具那样常用,但对于经验丰 ...

  6. Delphi应用程序的调试(二)使用断点

    Delphi应用程序的调试(二)使用断点 使用断点(Using Breakpoints) 当用户从Delphi IDE 运行程序时,程序全速运行,只会在设置了断点的地方停住. New Term 断点( ...

  7. Delphi应用程序的调试(一)

    集成式调试器是Delphi IDE的一个重要特性.该调试器使用户能方便地设置断点.监视变量.检查对象等等.在运行程序时,使用该调试器能快速查找出程序发生了什么(或未发生什么).一个号的调试器对程序开发 ...

  8. 64位内核开发第六讲,Windbg调试ring3跟Ring0.一起调试

    目录 驱动第六讲_Windbg连续调试Ring3.与Ring0 一丶Windbg连调试 驱动第六讲_Windbg连续调试Ring3.与Ring0 一丶Windbg连调试 有时候我们调试一个程序.可以使 ...

  9. Web开发者的六个代码调试平台

    代码调试平台是Web开发者进行开发.测试.分享.协作和交流的网络应用,它们支持实时的编辑.预览HTML.CSS和JavaScript的客户端代码.这些代码调试平台最值得称道的地方在于,它们中的大多数都 ...

随机推荐

  1. application/json 与 application/x-www-form-urlencoded的简单比较

    application/x-www-form-urlencoded 提交请求示例 curl -X POST 'http://localhost:8080/formPost' -d 'id=1& ...

  2. MVC2 ,MVC3 ,MVC4,MVC5的区别,EF的各个版本的区别;LocalDB是个啥

    2010年發行ASP.NET MVC 2.0版,2011年發行ASP.NET MVC 3.0版,2012年發行ASP.NET MVC 4.0版 MVC3 需要.net framework 4.0 版本 ...

  3. Spring中初始化bean和销毁bean的时候执行某个方法的详解

    关于在spring  容器初始化 bean 和销毁前所做的操作定义方式有三种: 第一种:通过注解@PostConstruct  和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作 ...

  4. 一篇关于apache commons类库的详解[转]

    1.1. 开篇 在Java的世界,有很多(成千上万)开源的框架,有成功的,也有不那么成功的,有声名显赫的,也有默默无闻的.在我看来,成功而默默无闻的那些框架值得我们格外的尊敬和关注,Jakarta C ...

  5. 关于HTTP Message

    HTTP Message包括JS, HTML等Resource.这些都是相对来说有代码可以写的东西,但是原理的东西是没有代码的.coding只是很少的一部分工作内容. Browser的流程.比如con ...

  6. kafka学习之-集群配置及安装

    1.软件版本 kafka2.10_0.9.0.0 zookeeper_3.4.6 2.集群节点 一共有3台机器. 192.168.14.100 slave-01 192.168.14.105 slav ...

  7. Java编程思想学习笔记——接口

    1.抽象类和抽象方法 抽象方法:不完整的,仅有声明而没有方法体. abstract void f(); 抽象类:包含抽象方法的类.(若一个类包含一个或多个抽象方法,则该类必须限定为抽象的.) 1.用抽 ...

  8. 用python将MSCOCO和Caltech行人检测数据集转化成VOC格式

    代码:转换用的代码放在这里 之前用Tensorflow提供的object detection API可以很方便的进行fine-tuning实现所需的特定物体检测模型(看这里).那么现在的主要问题就是数 ...

  9. v9定时发布的简单实现方法[支持静态生成]

    将以下代码放到 api/count.php 文件最后 的 ?>之前 //add 定时发布审核功能 $modelid = $modelid ? $modelid : intval($_GET['m ...

  10. LINE 不被封锁的技巧

    什么是封锁? 谈LINE 被封锁之前,我们先来了解一下什么是封锁.LINE 的封锁分为「好友封锁你」与「官方封锁你」二种,有些人将官方封锁讲成「停权」,其实LINE 的停权并不是你的帐号全被封锁,被封 ...