本文描述了可用于诊断客户报告的 Eclipse 插件问题的策略。这些策略最强大之处在于能够将一个调试会话从一个 Eclipse 实例附加到正在远程主机上运行的 Eclipse 实例上。本文中所描述的策略对于基于 Eclipse 2.x 的所有产品都有效,如 WebSphere Studio Application Developer 和 WebSphere Studio Site Developer。
因此,您写了一个 Eclipse 插件,您将它交给了用户 — 那个用户甚至可能为其支付了费用。该用户迟早会报告问题。有时您只要根据症状报告就能够断定发生了什么事。而在其它时候,错误将十分棘手,以至于您需要从用户那里获取更多信息,包括其系统配置,以及确保他实际正在运行的插件版本是正确的。而在最坏的情况下,您甚至无法在您的环境中重现问题;您需要直接访问用户的机器以真正地了解发生了什么事。
所幸的是,只要具备少量的工作台工具知识和访问插件元数据的方法,您就可以诊断客户针对插件可能报告的任何问题。在本文中,您将看到:
□ 如何获得客户工作台配置方面的综合信息,包括所安装的插件和功能部件,还包括它们每一个的版本
□ 工作台错误作为日志记录在哪里
□ 在哪里找到特定于特殊插件的元数据
□ 如何从您自己的工作台调试客户的环境
工作台配置
Eclipse 提供了一种简单的方法来抽取一个正在运行的工作台实例的配置细节(另请参阅图 1):
1. 在工作台的主工具栏中展开 Help 菜单。
2. 选择 About ...(菜单项的文本总是以“About”开头,但还可能包含特定于产品的文本,如“About IBM WebSphere Studio Application Developer”或“About IBM WebSphere Studio Site Developer” — 这都取决于您正在使用的工作台的特点)。
3. 在出现的对话框中,按 Configuration Details 按钮。
图 1. About... 对话框
在当前透视图的编辑器区域将打开一个名为“Configuration Details”的文件。该文件含有以下信息:
□ 正在运行工作台 JRE 的所有 Java 系统特性
□ 已安装功能部件和插件及各自版本的完整列表
□ 安装/更新管理器活动的日志
□ 工作台错误日志的完整文本
您有时候可能会希望客户给您发送整个日志的副本。幸运的是,将日志保存到文件系统很容易:
1. 确保 Configuration Details 文件在其中打开的编辑器位于前面并且具有焦点。
2. 在工作台的主工具栏中选择 File 菜单。
3. 选择 Save Configuration Details As... 菜单项。
在图 1 中还请注意,在 About... 对话框中另外两个按钮 Feature Details 和 Plug-in Details 也可用。按其中的任意一个按钮,会出现一个对话框,该对话框中含有插件/功能部件及其版本的表视图。如果您希望迅速知道是否真的安装了插件,或者是否安装的插件为某个版本,那么您可能希望让客户先检查一下那些对话框中的清单,而不是让他发送其整个配置细节文件。
工作台错误日志
错误日志按年月日顺序(离现在越近的消息越靠近文件尾部)包含工作台和插件代码选择记录的任何消息和异常。工作台自动将所有未捕获的异常记录到错误日志中。
错误日志的文本包含在我们于前一节中生成的 Configuration Details 文件中。Eclipse 还从 Error Log 视图提供了错误日志的图形视图,Error Log 视图可以在 PDE Runtime 视图类别下找到。(要打开视图,请选择 Window > Show View)。错误日志条目在表中以行的形式出现;最近的条目显示为第一行。您可以这样来查看某个条目的详细信息:选择一行,单击鼠标右键,然后选择 Properties。在出现的特性对话框中,特定日志条目的详细信息位于 Status Details 页上。另请参阅图 2。
图 2. Error Log 视图
错误日志文件本身作为 .metadata/.log(相对于工作空间 root)驻留在文件系统上。工作空间 root 常常直接位于工作台安装目录中,作为名为 workspace 的文件夹(这是 Eclipse 缺省工作空间位置)。然而,用户可以将其工作空间 root 配置为文件系统中的任何文件夹。
插件注册表
Configuration Details 文件列出了安装在工作台实例中的功能部件和插件。然而,该文件并不指示各个插件是否是活动的。
插件是惰性装入的 — 即其代码只有在需要的时候才装入内存。这样,就会出现这样一种情形,插件已经安装了,但因为某些原因,它却没有被激活。这表明:要么是在工作台试图装入该插件时发生了错误,要么只是还没有访问插件的功能。
Plug-In Registry 视图列出了已安装的插件,并指示每个插件是否是活动的。要打开该视图,请转向 Window > Show View。可以在 PDE Runtime 类别下找到该视图。
插件是根据名称排序的(显示的是名称而不是插件标识)。如果插件图标的上面放有一个“runner”图标,那么该插件是活动的。
图 3. Plug-in Registry 视图
图 3 显示了一个样本工作台安装的 Plug-in Registry 视图。请注意,并非所有显示的插件都是活动的,只有那个名为“Apache Axis”的插件才是活动的,其图标包含“running”修饰。
在激活(或者取消激活)插件时,插件注册表视图并不自动更新。要检取插件的当前启用/禁用状态,请按视图标题栏中的 Refresh 按钮。否则,视图所反映的仍将是视图首次显示时所存在的事务状态。
插件元数据
插件通常会维护特定于自己的元数据。该元数据可以采取任何形式:特性文件、XML 文件甚至特有的二进制格式。当元数据采用人们可以读懂的格式时,这对直接查看元数据文件会很有用。
插件元数据驻留在文件系统的 .metadata/.plugins 目录(相对于工作空间 root)下。.plugins 目录内有一些文件夹,它们各自对应一个插件,以便维护它们自己的元数据。每个文件夹的名称都与对应插件的标识相同。该插件的元数据应该能够在文件夹中找到。
插件创建者也可能已经选择了使用插件的缺省 preferences.ini 文件,该文件位于插件的 install 文件夹中。该 install 文件夹将包含插件的标识,并且将位于 plugins 目录中,安装就是在该目录中进行的(该目录通常可以直接在工作台安装 root 下找到,但请记住,插件安装位置是可配置的)。
请注意,让插件在我们刚才描述的位置维护其元数据被认为是工作台最佳做法。不过,您应该警惕这种可能性,即插件创建者可能选择不遵循这一约定,而将元数据存储在其它一些位置,如系统 temp 目录。
调试远程工作台
用于维修 Eclipse 插件代码的功能最强大的工具是 Eclipse 调试器调试客户工作台的能力,即便客户的工作台运行于远程机器上也不例外。任何运行工作台实例的机器,只要能够通过网络进行访问,您都可以使用 Eclipse 安装的 Debug 透视图来调试实例上所出现的问题。远程工作台借助开放的套接字来公开其调试信息(清单 1 显示了打开调试套接字所需指定的 Eclipse 启动参数)。在将调试器连接到客户的工作台之后,您就可以利用 Eclipse 调试器的全部功能,如设置断点、检查变量和执行堆栈等等。(有关使用 Eclipse Java 调试器的详尽信息可以在工作台帮助中获得,工作台帮助可以通过工作台的 Help > Help Contents 菜单项来访问。)
重要:工作台工作空间中的源代码必须与用来构建(客户安装的)插件版本的代码相匹配。在继续之前,需要确定客户所安装的代码的级别,并确保您工作空间中的代码与之匹配。
在确信源代码处于正确的级别之后,客户必须使用下列参数(显示在清单 1 中)来启动其工作台实例,以启用到远程调试器的连接。
清单 1. 启动可远程调试的工作台
eclipse.exe -vmargs -Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n
请注意赋给 address 的值,它是一个端口号,远程调试器将开放该端口供连接使用。在上面的示例参数中,端口号是 8000。要明白,客户可能位于防火墙的后面,他可能必须对防火墙进行配置,以便您能够建立套接字连接。
指定 server=y 将表明您刚刚启动的 VM 将等待进入的套接字连接。通过指定 suspend=n,您允许 Java 类的执行继续进行。通过指定 suspend=y(或者完全忽略 suspend 指定,因为 y 是其缺省值),您将告知刚刚启动的 VM:在装入主类之前,您希望它立即暂停。
现在,必须从您的工作台将调试器连接到客户的会话:
1. 切换到 Debug 透视图(Window > Open Perspective)。
2. 从主工作台菜单选择 Run > Debug...。(或者,从(工作台工具栏中的)Debug 按钮上的下拉菜单选择 Debug...)。
3. 在启动配置对话框的左侧视图中选择 Remote Java Application 项。
4. 单击 New 按钮。随后会创建一个新的远程启动配置,并会显示三个选项卡:Connect、Source 和 Common。
5. 在 Connect 选项卡的 Project 域中,输入或者通过浏览选择要使用的项目作为启动的参考(用于源码查找)。对于远程工作台调试,您无须指定项目。
6. 在 Connect 选项卡的 Host 域中输入正在运行 Java 程序的主机的 IP 地址或域名。如果程序与工作台运行于同一台机器上,那么请输入 localhost。
7. 在 Connect 选项卡的 Port 域中输入端口,远程 VM 在该端口上接受连接。在我们的示例中,这个值为 8000,它匹配使用清单 1 中的参数启动远程工作台时所指定的端口。
8. Allow termination of remote VM 标志是一个开关,它确定调试器中是否支持 Terminate 命令。如果您希望能够终止目前所连接的 VM,那么请选择此选项;您一般不需要这么做。
9. 单击 Debug。启动试图通过指定的地址和端口连接到 VM,结果显示在 Debug 视图中。如果启动程序无法通过指定的地址连接到 VM,那么会出现一条错误消息。
图 4. 启动连接到远程工作台的调试会话
现在,您已连接到客户的工作台了。可以要求用户在其工作台中执行任何您希望的操作,而其工作台状态将反映在调试会话中。
在以这种方式进行调试的时候,您可能希望使用远程控制工具(如由 WinVNC 或 Lotus Sametime 提供的工具)来直接控制客户的桌面,以便您能够自己在客户工作台上启动操作。
如果检索到正确级别的代码,那么您将能够使用这一技术来代替跟踪机制。Eclipse 提供了一个优秀的跟踪框架(请参阅参考资料以获取链接),但象所有跟踪机制一样,这种跟踪框架要求将其代码插入插件源代码中来产生跟踪语句。那些代码会有一些性能损失,即便关闭了跟踪也是如此,而且它们肯定会增加代码资源占用量。而且,您要受开发人员的制约 — 如果在您需要插入跟踪语句的某个地方没有插入跟踪语句,那么跟踪对您将毫无帮助。然而,有了远程调试技术,您就不必为之担忧了 — 您拥有完全源代码级调试的能力。
建议的客户服务过程
在本文中,您看到了一组用于诊断 Eclipse 插件客户问题的工具。现在,如何以最适合于您及您的开发小组的方式使用这些工具就由您决定了。对客户服务过程的一个建议是:
1. 如果您无法光凭错误报告来重现问题,那么就叫客户把他的配置文件副本发一份给您。用它来确保您的插件版本与用户的插件版本相同。您还需要仔细检查错误日志以了解“泄密”消息和堆栈跟踪。
2. 如果问题看起来是个插件激活问题,那么您可能要让用户检查其插件注册表视图来替您一查究竟。
3. 如果似乎是插件元数据处理方面出了错误,或者问题特定于用户安装插件的方式,那么就叫用户把您认为可能有嫌疑的特定于插件的元数据文件副本发给您。
4. 如果这些都不奏效,那么请将匹配级别的源代码装入您的工作空间,然后远程调试客户的工作台。
当然,要找到客户问题的症结所在,您必须保持灵活,具体问题具体分析。
结束语
基于 Eclipse 的工作台为综合可服务性提供了从查看详细配置信息到对客户安装进行实际代码级别调试的广泛功能。