第十二章-异常处理与程序调试(二)(5)

12.4 程序调试简介 

Delphi提供了一个功能强大的内置调试器(Integrated Debugger), 因而对程序的调试不用离开集成开发环境(IDE)就可以进行。

程序错误基本可以分为两类,即运行时间错和逻辑错。所谓运行时间错是指程序能正常编译但在运行时出错。逻辑错是指程序设计和实现上的错误。程序语句是合法的,并顺利执行了,但执行结果却不是所希望的。

对于这两类错误,调试器都可以帮助你快速定位错误,并通过对程序运行的跟踪和对变量值的监视帮助你寻找错误的真正原因和解决错误的途径。

程序调试的主要内容可以概括为如下的几方面:

1.调试的准备和开始;

2.控制程序的执行;

3.断点的使用;

4.检查数据的值。

程序调试只有用户实际上机操作才能真正掌握。在这一节中我们主要对调试中的主要问题和一些关键点进行介绍。至于一些很细小的问题相信读者可以在上机实际应用中掌握,因而没有列出。

12.4.1 调试的准备和开始 

在程序开发过程中程序编码和调试是一个持续的循环过程,只有在你对程序进行了彻底的测试后才能交付最终用户使用。为了保证调试的彻底性,在调试前应制定一个详细的调试计划。一般说来应该把程序划分为几个相对独立的部分,分别进行调试,以利于错误的迅速定位,确保每一部分程序都按设计的要求运行。

调试计划准备好后就可以开始程序的调试。

开始一个调试过程包括:

1.编译时产生调试信息;

2.从Delphi里运行你的程序。

在程序调试过程中,程序的执行完全在你的控制之中。你可以在任何位置暂停程序的执行去检查变量和数据结构的值,去显示函数调用序列,去修改程序中变量的值以便观察不同值对程序行为的影响。 

12.4.1.1 产生调试信息 

要使用内部调试器必须选中Option| Environment菜单References页的Integrated Debugging检查框。缺省情况下该框被选中。

在开始调试前需要使用Symbols Debug Information(调试符号信息)编译工程文件。调试符号信息包含了一个符号表,能够使调试器在程序的源代码与编译器产生的机器代码间建立联系。这样在程序执行中可以同时查看对应的源代码。

Delphi 在缺省情况下自动产生调试符号信息。在集成开发环境中的开关选项是Option|project菜单Compiler Options页的Debug Information and Local Symbols检查框。

当产生的调试符号信息供内部调试器使用时,编译器把调试符号表储存在每个相应的.dcu文件中。

如果希望在集成环境外使用Turbo Debugger,则需要把调试信息储存在最终的 .exe文件中。为此需要选定Option|Project菜单Linker页的Include TDW Debug Info检查框。

由于储存调试信息大大增加了执行文件的大小,因而调试完成后应重新生成一个不包含调试信息的执行文件。 

12.4.1.2 运行程序 

通过调试器(包括内置调试器)运行程序,当程序处于等待状态时,调试器可以获得控制,利用调试器的功能来检查当前程序的状态。通过合理布置屏幕显示,使应用程序运行窗口和Code Editor(代码编辑器)互不重叠,可以让用户在它们间方便地切换以观察代码执行的效果。

如果希望使用命令行参数来调试程序,则可以通过Run|Parameters 菜单打开运行参数对话框进行设置。 

12.4.2 程序运行的控制 

程序运行控制的方法和使用如下表。 

表12.7  程序运行控制的方法和使用途径

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

方法 使用途径

───────────────────────────────

运行到光标位置 ● Code Editor加速菜单的Run to Cursor项

(Run to Cursor) ● Run主菜单的Run to Cursor项

● F4

跟踪(Trace Into) ● Run主菜单的Trace Into项

● Trace Into加速按钮

● F7

步进(Step Over) ● Run主菜单的Step Over项

● Step Over加速按钮

● F8

运行到断点 设置断点并按正常方式运行

暂停程序执行 Run主菜单的Program Pause项

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

跟踪和步进都是一种单步执行方式。但“步”的含义不同。对跟踪而言它一次执行一条简单程序语句。当碰到包含调试信息的函数或过程调用时则跳入该函数或过程,并执行其第一条可执行语句。对步进而言它一次执行一条当前模块的可执行语句,而不管该语句是否是函数或过程调用。

运行到光标位置和运行到断点都是程序正常运行到某一确定的源代码位置,而后进入调试状态。但相对于运行到光标位置而言,运行到断点更为灵活。因为断点一次可设置多个,同时也可以对断点设置一定的条件。只有满足该条件程序运行才会中止。

时间: 2024-08-01 15:32:54

第十二章-异常处理与程序调试(二)(5)的相关文章

第十二章-异常处理与程序调试(三)(2)

12.4.4.1 监视表达式 监视列表窗口(Watch List Window)显示程序运行中当前监视表达式的值. 选择View|Watches可以打开监视列表窗口. 从Code Editor中添加一个监视表达式最方便的方法是: 1.选中要监视的表达式: 2.从Code Editor加速菜单中选择Add Watch把表达式添加到监视列表窗口. 也可以利用下面的方法产生一个监视表达式: 1.用下列方法之一打开监视属性对话框(Watch Properties Dialog Box): ●主菜单中选择

第十二章-异常处理与程序调试(一)(1)

在应用程序开发中如何检测.处理程序的运行错误是一个很重要的问题.在 Delphi 的集成开发环境( IDE )中提供了一个完善的内置调试器,可以帮助你发现大部分程序错误.但并不是所有的错误都可以被发现,而且当程序涉及到与外设的数据交换或操作外设,如要求用户输入.读写磁盘等时,错误的发生是程序无法控制的,如输入非法字符.磁盘不能读写等.这些情况不仅会导致应用程序异常中止而且可能引起系统的崩溃.针对这些问题,Delphi同时提供了一套强大的异常处理机制.巧妙地利用它,可以使你的程序更为强健,使用更为

第十二章-异常处理与程序调试(三)(1)

12.4.3 断点的使用 12.4.3.1 设置断点 设置断点首先在Code Editor中选定你想设置断点的代码行,而后进行如下的任一种操作: ● 单击选定代码行左边的空白 ● 按F5 ● 选择Code Editor加速菜单的Toggle BreakPoint项 ● 选择Run|Add Breadpoint打开断点编辑对话框(Edit BreakPoint Dialog Box),而后选择New去确认一个新的断点设置或选择Modify去对一个存在的断点进行修改 ● 从BreakPoint Li

第十二章-异常处理与程序调试(二)(4)

12.3.6 利用异常响应编程 利用异常处理机制不仅能使程序更加健壮,而且也提供了一种使程序更加简捷.明了的途径.事实上,使用自定义异常类就是一种利用异常响应编程的方式.这里我们再讨论几个利用标准异常类编程的例子. 比如为了防止零作除数,可以在进行除法运算前使用if-then-else语句.但如果有一系列这样的语句则繁琐程度是令人难以忍受的.这时候我们可能倾向于使用EDivByZero异常.例如如下一段程序就远比用if-then-else实现简捷明了. function Calcu(x,y,z,

第十二章-异常处理与程序调试(二)(3)

12.3.5.1 定义异常对象类 异常是对象,所以定义一类新的异常同定义一个新的对象类型并无太大区别.由于缺省异常处理只处理从Exception或Exception子类继承的对象,因而自定义异常类应该作为Exception或其它标准异常类的子类.这样,假如在一个模块中引发了一个新定义的异常,而这个模块并没有包含对应的异常响应,则缺省异常处理机制将响应该异常,显示一个包含异常类名称和错误信息的消息框. 下面是一个异常类的定义: type EMyException = Class(Exception

第十二章-异常处理与程序调试(二)(2)

12.3.3 响应一族异常 诸如 on ExceptionType do 的异常响应语句不仅可响应本类异常,而且可以响应子类异常.对于象EIntError.EMathError等系统不会引发的异常,它们将只响应其子类异常.而对于象 on Exception do 这样的语句将会对任何异常进行响应. 下面一段代码对整数越界异常进行单独处理,而对其它整数异常进行统一处理: try {整数运算} except on ERangeError do {越界处理} on EIntError do {其它整数

第十二章-异常处理与程序调试(二)(1)

异常响应为开发者提供了一个按自己的需要进行异常处理的机制.try -except -end形成了一个异常响应保护块.与finally不同的是:正常情况下except 后面的语句并不被执行,而当异常发生时程序自动跳到except,进入异常响应处理模块.当异常被响应后异常类自动清除. 下面的例子表示了文件打开.删除过程中发生异常时的处理情况: uses Dialogs; var F: Textfile; begin OpenDialog1.Title := 'Delete File'; if Ope

第十二章-异常处理与程序调试(一)(5)

12.1.3 部件异常类 12.1.3.1 通用部件异常类 通用部件异常类常用的有三个:EInvalidOperation.EComponentError.EOutOfResource.其中EInvalidOperation.EOutOfResource在Controls单元中定义:EComponentError在Classes单元中定义. 1.非法操作异常 EInvalidOperation EInvalidOperation 引发的原因可能有: ● 应用程序试图对一个Parent属性为nil

第十二章-异常处理与程序调试(一)(3)

12.1.1.4 浮点异常 浮点异常是在进行实数操作时产生的,它们都从一个EMathError类派生,但与整数异常相同,程序运行中引发的总是它的子类EInvalidOp.EZeroDivide.EOverFlow.EUnderFlow. 表12.4 浮点异常类及其引发原因 ━━━━━━━━━━━━━━━━━━━━━━━━ 异常类 引发原因 ──────────────────────── EInvalidOp 处理器碰到一个未定义的指令 EZeroDivide 试图被零除 EOverFlow 浮