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

Delphi7中提供了一些附加调试工具来帮助用户检查程序错误。从性能上讲,其中一些工具属于高级调试工具。尽管高级调试工具不像其他工具那样常用,但对于经验丰富的编程人员来说,它们是非常有用的。

Evaluate/Modify对话框(The Evaluate/Modify Dialog Box)

该对话框用于检查变量的当前值和修改变量的值。使用这个对话框,用户可以修改某个变量的值来测试不同的输出结果。在调试期间改变一个变量的值,使用户能测试程序不同参数的效果,而不必每次都重新编译。如下图主菜单【Run | Evaluate/Modify】或按【Ctrl + F7】

Note

该对话框的工具栏即可显示大图标也显示小图标,要在大小图标进行切换的话,用鼠标拖动位于工具栏下方的线条,工具就会在大小图标间进行调整了。

Evaluate/Modify对话框,类似于Watch List和Debug Inspector。如果点击代码中的一个变量,并从Code Editor的快捷菜单中选择【Evaluate/Modify】菜单项,该变量会自动被求值。也可手动输入要进行求值的变量,从主菜单选择【Run  | Evaluate/Modify】菜单项,然后输入要求值的变量名。

Expression字段用于输入要对其求值的变量名或表达式。点击Evaluate按钮或按Enter键,表达式或变量就会被求值。结果显示在Result字段中。如下图:

Note

Evaluate/Modify对话框可当做一个简易计算器使用,可输入十六进制数(或十进制数,或两者都可)的数学公式,让计算器计算结果。例如如下图:

还可在Expression中输入逻辑表达式,Result显示True。如下图:

程序必须停在断点处才能使用Evaluate/Modify对话框这一功能。

如果用户想要改变一个变量的值,可在New Value字段输入新值并点击Modify按钮,变量就会变成输入的新值。当用户点击Run按钮重启启动程序(或继续步进调试)时,就会使用新值。

Note

与Watch List和Debug Inspector不同的是,当用户一行一行执行代码时,Evaluate/Modify对话框不会自动更新。如果代码改变了Evaluate/Modify对话框中变量的值,必须再点击Evaluate按钮才能看到改变后的值。这使得Evaluate/Modify对话框有个优点:步进式调试代码时速度更快,因为调试器不必每执行一行代码就求一个表达式的值。可交互地使用这个对话框来求变量或表达式的值,并且求完值后立即关闭此对话框。

调用栈窗口(The Call Stack Window)

在程序运行阶段,用户可通过查看调用栈来检查应用程序调用的函数或过程。从主菜单上选【View | Debug Windows | Call Stack】菜单项来显示Call Stack窗口,该窗口列出应用程序调用的函数和过程,按调用顺序的先后排列,最近调用的函数或过程列在窗口顶部。

双击Call Stack窗口中的方法名,会显示该方法的代码行(如果该方法在应用程序中);当函数或过程的代码不存在时(VCL方法), Call Stack窗口显示该过程所在的模块名和地址。双击没有源代码的函数和过程,会显示CPU窗口。

当碰到Windows Access Violation错误时,查看调用栈非常有帮助。通过查看调用栈,用户能找出程序中产生错误的位置;找到程序中错误位置是排除错误的第一步。

Tip

如果调用栈列表中包含有无意义的信息,那可能是调用栈被破坏了。被破坏的调用栈通常标志着栈溢出或内存覆盖。

CPU窗口(The CPU Window)

可从主菜单【View | Debug Windows | CPU】菜单项或按【Ctrl + Alt + C】来显示CPU窗口。 

CPU窗口使用户能够在汇编指令级查看应用程序。可以执行一个汇编指令就暂停一下;也可以运行程序至某条汇编指令(就像用常规调试器运行程序至某行源代码一样)。CPU窗口分成五个窗格:反汇编窗格(Disassembly pane)、寄存器窗格(CPU Registers pane)、标志窗格(Flags pane)、原始栈窗格(Machine Stack pane)和转储窗格(Memory Dump pane)。

每个小窗格都有一个快捷菜单,这个快捷菜单提供使用该窗格时所需的功能。要有效地使用CPU窗口,必须懂汇编语言。显然,CPU窗口是一个高级调试工具。

Go to Address命令(The Go to Address Command)

Go to Address命令也是一个高级调试工具。当应用程序出现故障时,Windows会显示一条出错消息,给出违例地址。用户可以使用Go to Address命令来找出程序中发生故障的位置。当Windows发出Access Violation出错消息时,会显示一个类似于下图的错误。

当用户看到这样的出错消息时,记下违例发生的地址,从Code Editor快捷菜单中选择【Debug | Go to Address】菜单项来显示Go to Address对话框。

把记下的地址输入到Go to Address对话框的Address字段中。点击OK,调试器就开始查找发生故障的源代码行。如果故障出现在代码中,则光标会指着产生错误的源代码行。如果是代码以外的地方发生故障,会弹出一个消息框告诉用户,代码中未找到该地址。这是一个高级调试工具,用户可能还从未使用过。

Delphi应用程序的调试(五)其他调试工具的更多相关文章

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

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

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

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

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

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

  4. Delphi应用程序的调试(六)步进式代码调试

    步进式代码调试(Stepping Through Your Code) 步进式代码调试是最基本的调试操作之一,但仍要在此讲述.人们常常容易犯只见树木不见森林的错误.经常复习基本的知识有助于读者了解以前 ...

  5. Delphi应用程序的调试(三)监视变量

    监视变量(Watching Variables) 当程序停在一个断点处时,用户做些什么呢?通常用户在断点处停下来是要检查变量的值,某个变量的值是否与预料的取值相同?或者某个变量取什么值(事先并不知道这 ...

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

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

  7. Delphi应用程序的调试(四)The Debug Inspector

    调试检查器(The Debug Inspector) Debug Inspector使用户能查看诸如类和记录的数据对象,也可以用它来查看整数.字符数组等简单数据类型,但这类简单数据类型最好是用Watc ...

  8. Delphi插件创建、调试与使用应用程序扩展

    Delphi插件创建.调试与使用应用程序扩展 翻译 : MiracleZ  有没有使用过Adobe Photoshop?如果用过,你就会对插件的概念比较熟悉.对外行人来说,插件仅仅是从外部提供给应用程 ...

  9. 应用调试(五)侵入式SWI

    目录 应用调试(五)侵入式SWI 场景应用 测试程序 修改APP的bin 修改SWI 获得当前进程的寄存器 测试运行 恢复代码 进程间内存拷贝 TODO 更多参考文献 title: 应用调试(五)侵入 ...

随机推荐

  1. e827. 设置JSplitPane中分隔物的大小

    A divider can be no less than one pixel in size. // Create a left-right split pane JSplitPane pane = ...

  2. unity------------------------------transform.forward与Vector.forward的区别

    在unity3d中有2个forward,一个是vector3.forward和transform.forward,这两个forward其实完全不一样.他们之间的区别主要体现在在不同坐标系时的反映上. ...

  3. 嵌入式开发之zynq---Zynq PS侧sd驱动

    http://blog.chinaunix.net/uid-29404121-id-4217026.html http://blog.chinaunix.net/uid-29709984-id-430 ...

  4. MySQL ERROR 1045 (28000): Access denied for user 'root'@'localhost'解决

    MySQL ERROR 1045 (28000): Access denied for user 'root'@'localhost'解决: # /etc/init.d/mysql stop # my ...

  5. QIIME1 聚OTU

    qiime 本身不提供聚类的算法,它只是对其他聚otu软件的封装 根据聚类软件的算法,分成了3个方向: de novo:                   pick_de_novo_otus.py  ...

  6. Java注解Annotation学习笔记

    一.自定义注解 1. 使用关键字 @interface 2. 默认情况下,注解可以修饰 类.方法.接口等. 3. 如下为一个基本的注解例子: //注解中的成员变量非常像定义接口 public @int ...

  7. windows下Nginx与tomcat组合简单使用

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 项目中瓦片资源越来越多,如果提高瓦片的访问效率是一个需要解决的 ...

  8. Python自然语言处理学习——jieba分词

    jieba——“结巴”中文分词是sunjunyi开发的一款Python中文分词组件,可以在Github上查看jieba项目. 要使用jieba中文分词,首先需要安装jieba中文分词,作者给出了如下的 ...

  9. linux 系统安装mysql (rpm)

    其实按照本文安装成功,但是启动依然有问题:最好参考链接配置. http://blog.csdn.net/xiaoxiaoxuewen/article/details/7550107 我用的是ubunt ...

  10. 简单理解IoC与DI

    为了理解Spring的IoC与DI从网上查了很多资料,作为初学者,下面的描述应该是最详细,最易理解的方式了. 首先想说说IoC(Inversion of Control,控制倒转).这是spring的 ...