《PowerBuilder实用教程》叶核亚王青云第08章程序调试与创建可执行文件8.1程序调试技术8.2创建并运行可执行文件8.1程序调试技术8.1.1发现错误8.1.2调试画板8.1.3调试过程8.1.1发现错误当程序不能正常运行或者运行结果不正确时,表明程序中有错误。按错误的性质可将程序错误分成3类:语法错、语义错、逻辑错。1.语法错2.语义错3.逻辑错1语法错违反语法规范的错误称为语法错(SyntaxError),这类错误通常在编译时发现,又称编译错。例如,标识符未声明,表达式中运算符与运算分量类型不兼容,变量赋值时的类型与声明时的类型不匹配,if语句需要以ifend结束等。编译器一旦发现语法错就停止编译,并在脚本视图底部给出错误信息。PowerBuilder在保存脚本的同时进行编译,所以,如果脚本中有语法错,则编译不通过,无法保存。为避免产生语法错误,应严格按照语法定义编写脚本,注意书写细节,在书写属性和函数时,可以利用PowerBuilder的编辑提示功能,选择相应的属性和函数。2语义错若程序在语法上正确,但在语义上存在错误,称为语义错(SemanticError)。例如,输入数据的格式错,除数为0错,给变量或属性赋予超出其范围的值,试图打开一个不存在的文件,试图访问一个未打开的窗口等。此时程序能够通过编译,但在运行时会发生错误,所以这类错误又称运行错(Run–timeError)。系统发现运行错时,将停止程序运行,给出错误信息。语义错的产生视程序运行情况而定,不由程序本身所控制,程序中不能预见错误的发生。如果不希望程序因某个运行错而完全停止,则可以在应用程序对象的SystemError事件中写处理错误的程序。当程序运行过程中产生运行错误时,系统将会触发应用程序对象中的SystemError事件,执行该事件脚本。3逻辑错当程序通过编译,可运行,但运行结果却与期望值不符,这类错误称为逻辑错(LogicError)。例如,由于死循环而没有结果,循环次数不对等因素导致计算结果不正确等。因为系统无法找到逻辑错,所以逻辑错最难调试。此时,程序员必须凭借自身的程序设计经验,并运用PowerBuilder的调试功能,才能找到错误原因及出错位置,从而改正错误。8.1.2调试画板PowerBuilder集成开发环境提供了两种运行应用程序的方式:常规方式和调试方式。l常规方式:应用程序响应用户的交互操作并且一直执行直至用户终止它或出现运行错误。这是用户完整运行应用程序的方式。l调试方式:在脚本和函数中插入断点或进行脚本的单步执行,系统每遇到含有断点的行就停止执行,此时可以显示执行过程中变量的取值,以便找出脚本中的逻辑错误。调试画板(DebugPainter)是在调试方式下运行应用程序的工具。1.打开调试画板2.视图3.工具栏1.打开调试画板单击PowerBar上的【Debug】按钮,打开调试画板,调试画板由一个工具栏和若干视图组成,如下图所示。调试画板的工具栏全局变量局部变量源代码视图选择脚本查看变量断点行共享变量实例变量打开调试画板查看系统栈查看断点内存中的对象2视图调试画板包含的视图见下表。3工具栏打开调试画板后,主菜单增加了Debug菜单。Debug菜单下的菜单项与调试画板工具栏上的按钮一致。调试画板工具栏上按钮说明如下图所示。StartRemote启动远程调试Start运行至断点Continue继续运行StopDebugging停止调试StepOver单步执行StepIn单步进入RunToCursor执行至光标处SelectScript选择脚本AddWatch添加查看变量QuickWatch查看表达式StepOut单步跳出SetNextStatement设置下一条语句EditStop编辑断点RemoveWatch清除查看变量Close关闭画板8.1.3调试过程1选择需要调试的脚本在开始调试之前,首先需要选择跟踪调试哪一段脚本。在对象浏览视图中,选择需要调试的脚本,选中脚本将显示在源代码视图中。2设置/清除断点在常规方式下的脚本视图中,或在调试画板的源代码视图中,都可以设置断点。设置断点方法是,将光标停在脚本中的某行上,执行弹出式菜单InsertBreakpoint,之后在当前行之前有一个圆点,表示该行已被设置为运行时的断点。在断点行上执行弹出式菜单ClearBreakpoint,则可清除已设置的断点。8.1.3调试过程(续)3跟踪运行一旦设置好断点,就能在调试方式下运行应用程序。应用程序将会正常运行直至遇到含有断点的行才挂起。4查看变量值的变化情况调试程序时,系统将脚本中声明的全局、局部等变量的中间结果分别显示在不同的视图上。用户还可根据需要,将变量添加到Watch窗口以查看变量的动态变化情况。8.2创建并运行可执行文件应用程序经过设计、开发、调试和试运行,排除了明显的与潜在的错误并达到预期功能后,要把应用程序编译成可执行文件,这样用户就能够在没有安装PowerBuilder环境的计算机上,像运行其他软件那样运行应用程序了。在用户机器上运行PowerBuilder数据库应用程序,需要将用户机器设置为数据库的客户端,并且要有PowerBuilder虚拟机的支持,即还要携带系统的运行库文件8.2.1工程对象8.2.2在客户端部署应用程序8.2.1工程对象在集成开发环境中,可以运行应用程序,但系统并没有生成可执行文件(.exe)。如果需要生成可执行文件,必须创建工程对象,才能将调试通过的应用程序编译成可执行文件。工程对象(project)是一种独立的PowerBuilder对象,用于将应用程序编译成一个可执行文件(.exe)和多个PowerBuilder动态库(.pbd)。8.2.1工程对象(续)1创建工程对象2指定生成动态库3为动态库指定包含的附加资源1.创建工程对象执行File|New菜单,在New对话框的Project页上选择Application图标,则创建了一个工程对象。在工程画板中,需要为工程对象指定以下编译特性:l指定生成的可执行文件名。l指定哪些库需要生成动态库(PBD或DLL)。l指定资源文件,资源文件中声明应用程序中包含的附加资源,例如图像文件等。2指定生成动态库应用程序中在对象之间建立联系有两种方式:静态引用和动态引用。PowerBuilder只将所有静态引用的对象编译到可执行文件中,而没有将动态引用的对象编译到可执行文件中。所以运行时看不到动态引用的对象。为了使可执行文件在运行时能够显示动态引用的对象,必须将库文件(.pbl)编译生成动态库(.pbd)。动态库中包含了应用程序中所有动态引用的对象,这些对象能被可执行文件调用。应用程序可以包含多个库文件,每一个库文件编译生成一个动态库文件。在工程对象画板中,选中库文件右边的PBD复选框,则声明该库文件需要编译生成动态库,并指明了库文件的路径。3为动态库指定包含的附加资源对于动态引用的图像文件,它们属于应用程序使用的附加资源,没有包含在库文件中。因此,在生成的动态库中,也不会包含这些动态指定的图像。这时,需要制作一个文本格式的资源文件(.pbr),其中包含应用程序中所有动态引用的图像文件名。在工程对象画板的ResourceFileName编辑框中指定资源文件的路径,则可执行文件中能够显示这些位图、图标或图像文件。8.2.2在客户端部署应用程序PowerBuilder应用程序是运行在客户端的,用户使用的客户端机器通常不作为程序开发的基地,因而不需要安装PowerBuilder开发环境。或者说,PowerBuilder应用程序通常是运行在没有PowerBuilder环境的客户端的。这时,仅有应用程序的可执行文件和动态库是不够的,还必须要有PowerBuilder虚拟机的支持。PowerBuilder为脱离开发环境运行应用程序准备了一组动态链接库,称为DeploymentKit。这些运行库文件一般在Sybase\Shared\PowerBuilder目录下,并不是所有运行库文件都是必需的,可以根据应用程序的需要选择所需的运行库文件。8.2.2在客户端部署应用程序(续1)如果运行与数据库无关的PowerBuilder应用程序的可执行文件,需要以下3个运行库文件:pbvm90.dllPowerBuilder虚拟机,必需libjcc.dll必需libjsybheap.dll必需8.2.2在客户端部署应用程序(续2)将PowerBuilder数据库应用程序部署到用户机器,使之成为数据库的客户端,需要进行以下操作:安装数据库的客户端软件。通过ODBC或专用接口配置数据源,连接数据库。复制系统运行库中数据源接口文件和数据窗口引擎文件。数据源接口文件既可以是通用的ODBC,也可以是数据库的专用接口。复制应用程序的可执行文件及动态库文件。