Welcome

首页 / 软件开发 / Delphi / 第十二章-异常处理与程序调试(二)(5)

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

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项

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

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

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