PowerBuilder高级调试技术与技巧

(整期优先)网络出版时间:2019-06-27
/ 2

摘要 介绍PowerBuilder编程工具的高级调试技术,包括临时断点和条件断点设置、变量值改变断点设置、Just-in-time调试、中间层Jaguar CTS组件的远程调试等关键技术


关键词 断点;本地调试;远程调试;Jaguar组件


1 引言
PowerBuilder是数据库前端应用开发的主流编程工具,随着从Client/Server的两层开发模式到三层甚至多层开发模式的过渡,PowerBuilder不断增加新的功能以适应和推进这种转变。PowerBuilder 7的版本已经可以通过开发Jaguar中间层组件创建典型的分布式应用。这就给PowerBuilder的调试技术提出新的要求。
调试技术在任何软件开发中都站有及其重要的位置。利用PowerBuilder开发也不例外。PowerBuilder工具集成了强大的调试画板,使得调试变得容易,但其中的一些高级的调试技巧和技术并不是很容易掌握,而掌握和使用这些调试的高级技巧和技术是开发高质量软件产品的重要保证,也是优秀的PowerBuilder开发者必须具备的能力。
PowerBuilder提供的高级调试技术主要包括:设置临时和条件断点、设置变量值改变断点、Just-in-time调试、Jaguar组件远程调试术(Remote Debug)。前三种调试技巧适合于本地调试;最后一种是分布式应用中的调试技巧,可以在客户端对部署在应用服务端Jaguar CTS(Component Transaction Server组件事务服务器简称)的组件进行调试,包括调试陷入到事件或者方法的脚本,观察和更改组件变量等。
远程调试技术以本地调试为基础,是PowerBuilder做分布式开发的关键性技术,尽管与本地调试类同,但却又有其独特和复杂的一面,是做好PowerBuilder中间层组件开发的重要技术。当然,熟悉本地调试的各种技术细节,才能更好得进行远程调试。
对于基本的调试技术(比如设置断点、单步执行、屏蔽和清楚断点、监视变量等)不再累述。
2 PowerBuilder7的调试画板简介
调试画板集成了PowerBuilder强大的调试功能,包括以下主要的部分:
1)Breakpoints View:展示所有要调试的对象、事件、代码行信息、通过它很容易定位到需要调试的代码或者进行断点使能和屏蔽等操作。
2)Callstacks View:展示调试的断点在程序中调用的层次,返回时会按照这个压栈顺序返回。提供了程序执行的宏观线索。
3)Instances:展示实例化的远程组件状态等信息。只适用于远程调试。
4)Objects In Memory:展示加载到内存的对象列表。通过它可以观察对象在内存里的占用情况(不适用于远程调试)。
5)Source View:展示代码。
6)Source Browser:展示应用中所有的对象列表。
7)Source History:展示在Source View中曾经出现过的代码列表。
8)Variables View::展示所有类型的变量。可以在调试画板中人为修改变量值,或者设置在某个变量的值发生改变时中断程序而触发调试。
9)Watch View:展示选择出来的变量值,进行表达式的运算等。
3 本地调试
3.1设置临时和条件断点
对于一般的断点,可在Source View中很容易得设置。如果断点处在循环体中,可能不期望每次循环都跳到调试画板,这时候需要设置临时和条件断点。断点在多少次循环后被触发,属于临时触发;断点在满足某种表达式条件后被触发,属于条件触发;在相同的断点位置可以同时存在临时和条件两种触发机制。
打开对应的断点编辑弹出窗口(在Breakpoint View和Source View中都能打开),在Occurrence栏目填入一个整数,代表每循环多少次才触发这个断点;在Condition栏目填入一个表达式,比如ll_i = 10,这样,在这个循环中,每次在变量ll_i = 10这个条件满足时才触发断点。
可同时设置临时和条件触发,这种情况下必须两者都满足才触发断点。
当然条件触发也可以用于不属于循环性质的代码段里面。
3.2设置变量值改变断点
如果调试特别关心某个变量,关心这个变量的值在哪里改变了(比如由false变成true,由0变成非0等),这时可以设置变量值改变触发断点。方法是在Variables中选择要调试的变量,右键弹出菜单,选择Break on Change,这样,每次这个变量的值发生改变,就会触发断点,能够方便观察哪些代码对这个变量进行了赋值操作,有利于对这个变量的变化轨迹进行跟踪。
3.3Just-in-time调试
当按正常模式而不是调试模式运行应用的时候,如果程序运行不正常,甚至报错,可能需要退出程序,重新打开调试画板,调试这个异常或者错误,比较麻烦;选择just-in-time模式,就能在遇到需要调试的时候,即时切换到调试模式。


选择菜单Windows>System Options…在弹出窗口中选中Just In Time Debugging。在按正常模式运行程序时,只要切换到PowerBuilder窗口,就提示是否中断和调试程序,选择调试,会进入调试模式;如果出现系统错误,调试画板会自动弹出,让开发者进行调试,而不必特意选择调试模式。
4 远程调试
4.1远程调试的条件和准备
讨论了本地调试的一些技术和技巧后,转入远程调试方面。在远程调试中可以充分利用以上技术技巧。
要进行远程调试首先要满足几个条件:被调试的组件是PowerBuilder部署的nvo(非可视化)类型,Remote Debug(远程调试)选项是打开的;前者说明这种调试只局限于PB组件开发范畴,而不是其他类型的Jaguar组件,后者的满足要进入部署组件的工程对象画板,打开属性窗口,在components页框里看Supports remote debugging选项是否打开,没有的话就打开它。
以上的条件满足之后,在组件脚本里面设置好断点。打开调试画板,在PainterBar工具栏按Start Remote Debugging按钮,而不是通常调试本地应用的Start按钮,然后填写连接Jaguar CTS组件服务器的信息,选中要调试的组件。这时候可等待客户端的程序调用该组件了。
对于断点的设置,最好先打开组件对象,在需要调试的地方设置上断点,再进入调试画板,这样所设置的断点已经存在了,而不必再在Source Browser里面去找。
4.2远程调试具体方法
运行一个客户端程序,这个程序在另一个PowerBuilder中运行、或者是一个别的机器上的可执行程序,但都必须访问所调试Jaguar CTS组件的方法和事件,这样才能触发刚才的远程调试,当客户端程序调用Jaguar CTS的组件,并且运行到断点处(陷入到组件里面),刚才调试组件的PowerBuilder会在Windows任务栏中闪烁,提示用户可进行组件的远程调试了,切换到远程调试窗口,就能看到脚本和断点,调试方法与本地脚本调试基本相同,这时候需要充分利用前面所讨论的调试技术。
打开菜单View>Instances,对于Instances View,建议在远程调试阶段始终打开,这样能方便的切换对不同实例的调试,在Instances View里能观察中间层组件实例的三个状态:running代表这个组件实例在运行;,idle代表实例是空闲的,它的存在只是等待客户对它的方法的陷入;stopped代表运行中止状态。三个状态中一般是看不到running状态的,因为当触发调试的时候,实例是停在断点处,看到的状态是stopped,当调用完方法(组件方法陷入完成后),实例状态转为idle,running 状态由于陷入代码运行时间非常快,你无法观察到,除非你设定了某种循环让组件方法运行时间延长才能观察到
如果有两个以上的客户端陷入到相同的组件中,会出现两个实例,它们对应相同的包和组件信息,但标号不同,由实例号1、2…标识出,而且它们的状态可能不同,有的是stopped,有的可能是idle。选择不同的instance,可以分别调试,尽管不同的实例可能对应相同的组件。
5 结束语 建议调试的时候把源码中的窗口置顶函数注释掉,如setposition(topmost!)之类的函数,否则会切换不到调试画板。
远程调试比本地调试复杂得多,比如对相同的组件可以陷入多个方法的调用中,每个客户端的调用所走的位置不同,这时候需要切换不同的实例。
远程调试选项在一个组件调试成熟之后需要禁止掉,否则,就有可能被客户端的调试机制所利用,源代码被别的用户调试和检查。
适用于本地调试的Object In Memory和Watch View里面的表达式计算不被现在的PowerBuilder远程调试技术支持。

参考文献
〔1〕David M. C. Client/Server: A Developer's Guide. Revised Edition. IDG (M&T) Books, 1998.
〔2〕David M. C. Power Builder 6: A Developer's Guide. Revised Edition, .IDG (M&T) Books, 1998.
〔3〕 李志军, 李飞, 肖永波等编著. 《Sybase组件事物服务器Jaguar技术详解》. 电子工业出版社, 2000.
〔4〕Sybase Com. Building a Jaguar Component,
〔5〕武高明. PowerBuilder开发Jaguar CTS组件的远程调试技术. 程序员大本营—数据库专刊. 2002
〔6〕林颖贤,林大滨. 多层分布式结构技术在企业物资管理信息系统中的应用. 软件世界. 2001