程序调试

来源:互联网 发布:2016网络购彩恢复时间 编辑:程序博客网 时间:2024/05/11 12:34

没有人会在写程序的时候不出错误。如果只是语法错误,那么VFP在编译程序时就会指出,但VFP的编译器对逻辑错误就无能为力了。逻辑错误不同于语法错误,程序可能是一系列语法正确的指令,但结果却是错误的。在长而复杂的程序中,逻辑错误可能会非常隐蔽和模糊。某些典型的情况包括:程序对一个没有预见到的变量的值错误地进行了处理,或计算的顺序错了,选择了错误的工作区或主索引,在使用了一系列的不同的表之后没有恢复先前的环境等等。

      当程序运行时产生了错误或得到了不正确的结果,往往需要跟踪程序的运行才能找出错误所在,为此VFP提供了丰富的调试工具,帮助我们逐步发现代码中的错误,有效地解决问题。选择“工具/调试器”菜单项中,就打开了“调试器”窗口。也可以使用下面的任意命令打开调试器:

DEBUG

SET STEP ON

SET ECHO ON

下面就介绍调试工具的使用方法。

一.跟踪窗口


    在调试中,可以使用的一个最有用的方法就是跟踪代码,以此观察每一行代码的运行,同时检查所有的变量、属性和环境设置的值。

    用“窗口/跟踪”菜单项或工具栏中的跟踪按钮可以打开“跟踪”窗口。选择“调试/运行”菜单项,在打开的“运行”对话框中,选择要跟踪的程序或表单,在“跟踪”窗口打开它。如图1。在追踪代码时,工具栏提供了四种运行程序的方法:

l         <v:shape id="_x0000_s1052" <v:shape 每次执行程序的一个代码行,执行后程序暂停。如果被跟踪的程序调用了一个函数或过程,则跟踪进入调用过程或函数的内部。

l         每次执行程序的一个代码行,执行后程序暂停,但不跟踪被调用的过程或函数。

l         <v:shape id="_x0000_s1054" <v:shape 执行完当前过程或函数中的其余代码,然后回到调用程序。

l         运行当前程序到包含光标的行

当决定停止追踪代码,但又想把它执行完时,可以单击“继续执行”按钮,告诉VFP继续执行程序直到它遇到一个断点或程序的末尾。在检查了一个疑点区后可以单击这个按钮正常地结束程序。也可以通过单击“取消”按钮来终止程序。

断点允许将执行程序停止,设置断点可缩小逐步调试代码的范围。若要为某个特定的代码行设置断点,可以双击该行旁边的阴影页边,或者把光标放在行中并按下空格键或回车键。该代码行左边的灰色区域中会显示一个实心点 ,这表明该行已经设置了一个断点。除此之外,利用VFP的“断点”对话框(单击工具栏上的“断点对话框”按钮即可打开),还可以设置各种类型的断点。

缺省的断点类型是“在定位处中断”,这意味着程序在遇到这一行时暂停执行。“定位”文本框指定了断点的过程或函数名以及从这个过程或函数开始的行号。“文件”文本框指定了包含断点的文件。下表是设置断点指定位置和文件的示例:

位置

文件

在何处将执行程序停止

ErrHandler

C:\VFP\SAMPLES
\SERVERS\FOXISAPI
\Main.prg

在程序 MAIN.PRG 中,名字为 ErrHandler 的过程里的第一个可执行的行。

Main,10

C:\VFP\SAMPLES
\SERVERS\FOXISAPI
\Main.prg

在名字为 Main 程序的第十行。

Click

C:\Myapp\Form.scx

在文件 FORM.SCX 中,任何一个名字为 Click 的过程、函数、方法程序或事件的第一个可执行的代码行。

cmdNext.Click

C:\Myapp\Form.scx

文件 FORM.SCX 中,在 cmdNext 控件的 Click 事件中,第一个可执行的行。

cmdNext::Click

 

在任意文件中,父类为 cmdNext 的任何控件的 Click 事件中,第一个可执行的行。

    这种断点类型还可以指定追踪开始时的运行次数。假设在循环中有一处错误,在前100次循环时计算是有效的,但在100 次之后就会产生错误。我们当然不想遇到错误前一步一步地循环100次,这时只要在“运行次数”文本框中填入100,则调试器在循环过100 遍之后才开始追踪模式。

    第二种断点类型“如果表达式为真则在断点处中断” 指定只有当满足某一特定条件的时候,才在某特定行上将执行程序停止。“表达式”文本框将指定这一特定条件。

    在调试中经常会遇到这种情况:不想在某个特定的行上将程序停止,只有当满足某特定条件时才将程序停止。这时可以选择第三种断点类型“表达式为真时中断”。下表是断点表达式的示例:

表达式

用于

EOF( )

当表中的记录指针移过最后一条记录时,将程序停止。

'CLICK'$PROGRAM( )

在与 Click 或者 DblClick 事件相关的第一行代码上,将程序停止。

nReturnValue = 6

如果一个信息框的返回值存储在 nReturnValue 中,当用户在该信息框上选择“确定”的时候,将程序停止。

    如果要了解何时一个变量或者属性的值发生了变化,或者想知道何时运行条件改变了,那么可以选择第四种断点类型“当表达式值改变时停止”,对一个表达式设置断点。示例见下表:

表达式 

用于

RECNO( )

当表中的记录指针移动时,将程序停止。

PROGRAM( )

在任意一个新的程序、过程、方法程序或事件的第一行上,将程序停止。

myform.Text1.Value

当该属性的值由于用户交互或程序运行而发生了改变时,将程序停止。

 

二.局部窗口和监视窗口

    使用调试器的一个好处是:在程序暂停运行时能够很容易看到变量、数组元素、属性和表达式的运行值,从而确定代码是否正确。在“跟踪”窗口中,将光标定位到任何一个变量、数组或属性上,就可以在提示条中显示它的当前值。除此之外,调试器还为我们提供了两个窗口来完成这一功能。

    “局部”窗口会显示调用堆栈上任意程序、过程或方法程序里面所有的变量、数组、对象和对象元素。默认情况下,在“局部”窗口中所显示的是当前执行程序中的值。通过在“局部变量的位置”列表中选择程序或过程,也可以查看其他程序或过程的值。

    有时我们并不想查看所有的变量,而只是想看看一两个变量来确定它们为什么没有获得期望的值。在这种情况下,使用监视窗口更合情理。在“监视”窗口的“监视”框中,键入任意一个有效的 VFP 表达式,然后回车。这时,该表达式的值和类型就会出现在“监视”窗口的列表中。也可以在“跟踪”窗口或其他的“调试程序”窗口中,选择变量或者表达式,然后将它们拖至“监视”窗口中。在“监视”窗口中,那些已经改变的值会显示为红色。在“监视”窗口中,双击一个监视项,还可以对其进行编辑。

    局部窗口能查看任何例程及在那里定义了什么变量,而监视窗口只能查看当前过程或函数中的变量。在“局部”窗口和“监视”窗口中,单击数组或对象名称旁边的加号(+),可以查看数组或对象的下一级内容。当进入下一级时,就能够看到数组中所有的数组元素值,以及对象的所有属性设置。

在“局部”窗口和“监视”窗口中,通过选择所需的变量、数组元素或属性,然后单击“值”列,同时键入一个新值,即可改变这些变量、数组元素或属性的值。

 

三.事件跟踪

    有时候知道不同对象的事件被触发的顺序是很有帮助的。面向对象编程的真正秘密在于知道在每个事件的方法中放置什么代码,使它们以正确的顺序执行。有时当程序不能正常工作时,确定方法中代码是否正确的最简单方法是打开事件跟踪。在调试器中选定“工具/事件跟踪”菜单项,即可打开“事件跟踪”对话框。

    在这里可以选择需要跟踪的事件。缺省时,所有的事件都是预选定的。由于 MouseMove 和 Paint 事件发生次数频繁,很难看到其他的事件序列,所以建议把这两个事件从“跟踪事件”列表中移去。

    选中“开启事件跟踪”复选框即可激活事件跟踪,此后每当“跟踪事件”列表中的一个系统事件发生时,该事件名字就会显示在“调试输出”窗口中(单击工具栏中的“输出窗口”按钮即可打开),或者写到一个文件里。

 

四.使用错误处理程序

即使进行了大量的测试和调试,也不能保证程序不出错。比如在处理一个数据表时,发生了停电,就会毁坏这个表。那么以后当程序中用到这个表时,就会出现错误。当过程中的代码发生错误时,VFP 将检查与 ON ERROR 例程相关的错误处理代码。如果 ON ERROR 例程不存在,VFP 就显示默认的错误信息。在 ON ERROR 后面,可以包含任意有效的 VFP 命令或者表达式,但一般情况是调用一个错误处理过程或程序。

    在“命令”窗口中键入一个不认识的命令,如:AAA

这时会出现一个标准的 VFP 错误信息对话框,显示“不能识别的命令谓词”。但是如果执行下面的代码,活动的输出窗口中就会显示错误号 16,而不在对话框中显示标准的错误信息。

ON ERROR ?ERROR()   &&ERROR()返回一个代表了错误的数字

AAA

执行不带任何参数的 ON ERROR,会重新将错误信息设置为 VFP 内部指定的内容。

下面的代码描述了一个简单的 ON ERROR 错误处理程序:

lcOldOnError = ON("ERROR")  &&保存原始的错误处理程序

ON ERROR DO errhandler WITH ERROR() &&执行带有过程名的 ON ERROR

*错误处理例程所应用的代码部分

ON ERROR &lcOldOnError  &&重新设置原始的错误处理程序

 

PROCEDURE errhandler

LPARAMETER lnErrorNo

DO CASE

    CASE lnErrorNo = 1 &&文件不存在

        *显示合适的信息

        *采取一些手段修正错误

    OTHERWISE

        *显示一个通用的信息

ENDPROC

 

本讲介绍了VFP的调试工具,以及使用错误处理程序的方法。对于初级的编程人员来说,要熟悉调试应用程序只有通过不断地学习和上机操作来积累经验,即使对于编程高手,花在调试应用程序方面的时间仍然是可观的。不过,所有的努力将因为减少了维护应用程序的工作量而得到回报。

0 0