Eclipse平台是许多IBM产品(包括IBM®WebSphere®Studio和现在的IBM®Rational®Application Developer)的基础。 Eclipse平台是一个应用程序框架,旨在接受插件。 鉴于其基于插件的体系结构,Eclipse已被组件化。 每个组件都有单独的插件表示,这使许多开发人员可以开发单个成品。 但是,如果这些组件一起工作,可能会发生许多意外错误。 幸运的是,这是在开发平台本身时可以预料的,并且有很多方法可以诊断和解决这些问题。
.log文件
当Eclipse遇到运行时错误时,通常会引发异常,因此该错误应记录在.log
文件中。 每个Eclipse工作区都存在.log
文件。 它只会在发生错误时创建,并且可以在.metadata
目录下的工作区中找到。 对于插件开发人员而言,此文件中的信息至关重要,因为该文件通常由异常和堆栈跟踪组成。 开发人员可以通过自己的代码跟踪堆栈,以确定该插件在哪里失败。
作为最终用户, .log
文件也是查找问题的理想起点,但是它看起来令人生畏,对除插件开发人员本身之外的任何人都没有用。 这是找出哪个插件失败的好方法,但是不会告诉最终用户太多其他信息。
追踪选项
Eclipse的跟踪支持可以确定更多信息。 如果插件开发人员利用了跟踪工具,则在报告插件问题时您会发现它们很有用。 如果插件支持跟踪选项,则它将在插件的根目录中包含一个.options
文件。 使用这些跟踪选项,可以获得有关插件功能的更多详细信息。 顾名思义,该插件的痕迹通常会打印到控制台上,以描述该插件的活动。
选项文件
选项文件类似于Java™属性文件,默认情况下名为.options
。 该文件由键/值对组成。 以#开头的行表示注释。 通常,这些选项将是true / false选项,这将打开或关闭该选项。 其他选项可能包括跟踪级别(DEBUG,WARN或ERROR)或过滤器。
以调试模式启动Eclipse
为了利用跟踪选项并获得其输出,必须以调试模式启动Eclipse。 在调试模式下启动Eclipse的最简单方法是使用-debug
参数从命令行运行它,如以下示例所示。
D:\RAD6\rationalsdp.exe -debug [options file]
如果省略了可选的.options
,则Eclipse将在当前目录中查找.options
。
示例:Eclipse构建器
Eclipse有两种构建类型: 完全构建和增量构建。 增量构建将仅构建已修改的资源。 这是通过检查资源的最后状态来确定的。 当在项目上调用完全构建时,将重新构建项目中的所有资源。
在处理大型项目时,完整构建会非常耗时。 有时,似乎不必要时似乎正在进行完整构建。 通过使用跟踪选项,可以确定是否确实在进行完整构建。 对于此示例,将使用Java开发工具插件中的跟踪选项来监视Java构建器的活动。
清单1是Eclipse为Java开发工具(JDT)核心插件提供的.options
文件。
清单1. org.eclipse.jdt.core_3.0.1 \ .options
# Turn on debug tracing for org.eclipse.jdt.core plug-in
org.eclipse.jdt.core/debug=false
# Reports buffer manager activity
org.eclipse.jdt.core/debug/buffermanager=false
# Reports incremental builder activity : nature of build, built state reading, indictment process
org.eclipse.jdt.core/debug/builder=false
# Reports compiler activity
org.eclipse.jdt.core/debug/compiler=false
# Reports codeassist completion activity : recovered unit, inferred completions
org.eclipse.jdt.core/debug/completion=false
# Reports classpath variable initialization, and classpath container resolution
org.eclipse.jdt.core/debug/cpresolution=false
# Report type hierarchy connections, refreshes and deltas
org.eclipse.jdt.core/debug/hierarchy=false
# Reports background indexer activity: indexing, saving index file, index queries
org.eclipse.jdt.core/debug/indexmanager=false
# Print notified Java element deltas
org.eclipse.jdt.core/debug/javadelta=false
org.eclipse.jdt.core/debug/javadelta/verbose=false
# Reports Java model elements opening/closing
org.eclipse.jdt.core/debug/javamodel=false
# Reports post actions addition/run
org.eclipse.jdt.core/debug/postaction=false
# Reports java search activity
org.eclipse.jdt.core/debug/search=false
# Reports open on selection activity : recovered unit, inferred selection
org.eclipse.jdt.core/debug/selection=false
# Reports access to zip and jar files through the Java model
org.eclipse.jdt.core/debug/zipaccess=false
该文件中的选项将用于创建自定义.options文件。 在此示例中,希望跟踪工作空间中所有项目的构建,因为它们似乎花费了太长时间。 清单2中显示了以上文件中感兴趣的选项。
清单2. builder.options
#This is a global debug option for the plug-in and is necessary for any other options to work
org.eclipse.jdt.core/debug=true
#This will give us information about the builder's activity
org.eclipse.jdt.core/debug/builder=true
给定Eclipse主目录D:\ RAD6,将文件另存为D:\ RAD6 \ builder.options。
使用以下命令运行Eclipse:
D:\RAD6\rationalsdp.exe -debug builder.options
这将打开一个控制台日志窗口,并显示来自Eclipse的输出,如图1所示。您可以验证是否已加载选项文件。
图1. Eclipse启动输出
调用完整的构建之后,您的输出将类似于图2和清单3所示。
图2.调用完整项目构建后的示例输出
清单3.完整构建的输出
Starting build of BuilderExample @ Thu Mar 24 13:35:33 EST 2005
FULL build
About to compile example/ExampleC.java
About to compile example/ExampleB.java
About to compile example/ExampleA.java
Writing new class file ExampleC.class
Writing new class file ExampleB.class
Writing new class file ExampleA.class
Recording new state : State for BuilderExample (#0 @ Thu Mar 24 13:35:34 EST 2005)
Finished build of BuilderExample @ Thu Mar 24 13:35:35 EST 2005
保存ExampleA.java之后,您的输出类似于图3。与完整构建的输出相反,清单4显示了增量构建的输出。
图3.保存ExampleA.java之后的示例输出
清单4.增量构建的输出
Starting build of BuilderExample @ Thu Mar 24 13:37:25 EST 2005
Found source delta for: BuilderExample
Clearing last state : State for BuilderExample (#0 @ Thu Mar 24 13:35:34 EST 2005)
INCREMENTAL build
Compile this changed source file example/ExampleA.java
About to compile example/ExampleA.java
Writing changed class file ExampleA.class
Recording new state : State for BuilderExample (#1 @ Thu Mar 24 13:35:34 EST 2005)
Finished build of BuilderExample @ Thu Mar 24 13:37:25 EST 2005
这些是完整构建和增量构建的标准调用,但是在许多情况下,它们会由于未知原因被调用。 在这些情况下,拥有此类信息对于帮助您确定原因非常有用。 JDT插件还有许多其他跟踪选项。
使用控制台时出现问题
使用控制台日志窗口存在某些已知问题。 文本可以被换行,因为控制台窗口的缓冲区有限。 结果,长时间的会话后,某些文本可能会被截断。 如果要保存此数据,则需要将其从命令窗口复制并粘贴到文本编辑器中。 解决此问题的方法是将输出重定向到文件。 但是,重定向eclipse.exe的输出将无济于事,因为该可执行文件将调用Java™虚拟机(JVM™)并产生一个新进程。 新过程将仅打开控制台窗口,并且会发生相同的问题。 但是,由于Eclipse是Java应用程序,因此它可以作为Java进程启动,从而使您能够成功地重定向输出。 主类位于startup.jar中。 您可以使用以下命令启动Eclipse。
java -cp startup.jar org.eclipse.core.launcher.Main
您可以在此命令后附加一些其他命令行参数,以将输出重定向到文件:
java -cp startup.jar org.eclipse.core.launcher.Main -debug builder.options > output.txt 2>&1
您还可以创建一个批处理文件,以使其变得更容易,如清单5所示。
清单5. rundebug.bat
@echo off
java.exe -cp startup.jar org.eclipse.core.launcher.Main -data %1 -debug %3 > %2 2>&1
REM Usage: rundebug <workspace> <logfile> [options]
REM If [options] is left out, Eclipse will look for .options in the current directory
从开发方面进行插件跟踪
作为插件开发人员,您可能已经熟悉插件跟踪。 这在测试插件时非常有用,并且Eclipse插件开发环境(PDE)工作台具有对插件跟踪的内置支持。 让我们看一下如何向自己的插件中添加一些跟踪选项。
示例:Hello World插件
- 首先,创建一个新的插件,如图4所示。
图4.新的插件项目
- 单击文件->新建->其他->插件开发->插件项目
- 调用项目
HelloWorld
,如图5所示。
图5.插件项目名称
- 选择Hello,World模板,如图6所示,然后单击Finish。
图6.选择模板
- 下一步是创建选项文件。
- 单击File-> New-> Other-> Simple-> File ,如图7所示。
图7.创建.options文件
- 在插件根目录中创建文件,然后调用文件.options,如图8所示。
图8.新文件名
- 添加一个选项,如图9所示。
图9. HelloWorld的.options
- 保存并关闭选项文件。
- 现在,向插件添加一些跟踪
- 打开SampleAction类并找到
run()
方法,如图10所示。
图10. SampleAction类
- 可以通过以下方法调用来访问选项
-
Platform.getDebugOption(HelloWorldPlugin.getDefault().getBundle().getSymbolicName() + "/debug")
上面方法调用的说明
-
Platform.getDebugOption(字符串选项)
-
这将查看插件选项文件并返回该选项的String值。
HelloWorldPlugin.getDefault()。getBundle()。getSymbolicName()
-
代替对插件ID进行硬编码,这将返回插件ID-这样,如果插件ID被更改,则无需触摸代码
“ /调试”
- 现在,我们可以附加我们自己的特定选项
清单6显示了SampleAction的代码。
清单6. SampleAction.run()的代码
public void run(IAction action) {
boolean debug = Platform.getDebugOption(
HelloWorldplug-in.getDefault()
.getBundle()
.getSymbolicName() + "/debug")
.equalsIgnoreCase("TRUE");
if (debug) {
System.out.println("Opening message dialog");
}
MessageDialog.openInformation(window.getShell(), "HelloWorld Plug-in", "Hello, Eclipse world");
}
- 最后一步是测试插件。
- 单击运行->运行...
- 选择Eclipse Application或Runtime Workbench(这取决于Eclipse版本),然后单击New ,如图11所示。
图11.创建一个运行时工作台配置
- 切换到Plug-ins选项卡,并确保选择了Hello,World插件,如图12所示。
图12.选择插件
- 切换到“ 跟踪”选项卡。
- 通过选中复选框启用跟踪。
- 选择您的Hello,World插件并打开调试选项,如图13所示。
图13.启用跟踪
- 单击“ 应用” ,然后单击“运行” 。
- 一旦运行时工作台出现,请尝试单击“ Hello,World”按钮
- 切换回PDE工作台,您的调试消息应打印到控制台。
有关插件开发的更多信息,请参见参考资料小节中的PDE插件 。
Eclipse调试实用程序
为了使查找和访问这些跟踪选项更加容易,我创建了一个小型软件应用程序,该应用程序提供了类似于Eclipse启动配置所提供的GUI界面-请参见“可下载资源”部分。
调试实用程序提供了一些附加功能,以帮助确定Eclipse问题的原因。
- 产品检测
- 调试实用程序可以检测某些基于Eclipse的现有IBM产品,例如WebSphere Studio或Rational Application Developer。
- 追踪选项
- 与运行时工作台配置提供的功能类似,该实用程序将为所有具有.options文件的插件找到选项,并且可以打开或关闭它们。
- 该实用程序还允许您导入外部.options文件,或使用该实用程序中选择的所有选项导出.options文件。
- JVM选项
- 可以打开或关闭J9 JVM(用于IBM,Java™Developer Kit或JDK)。 另外,可以从JVM获得详细的Java输出。
- 这些功能将不在本文中讨论。 但是,调试实用程序自述文件描述了如何使用它们。
使用调试实用程序运行构建器示例
- 下载并安装该实用程序。
- 链接到实用程序。
- 解压缩档案并将其解压缩到Eclipse主目录,如图14所示。
图14.提取文件
- 使用提供的.bat文件运行该实用程序,如图15所示。
D:\RAD6\eclipse\debugUtil.bat
图15. Eclipse调试实用程序
- 将debugUtil.bat用于IBM产品。
- 对于基本的Eclipse或其他基于Eclipse的产品,请使用debugUtil_noVM.bat
- 这将要求java.exe在系统路径中
- 找到JDT核心插件,如图16所示。
图16.选择一个插件
- 打开调试选项和构建器,如图17所示。
图17.选择跟踪选项
- 输入工作空间位置或单击浏览以在文件系统中找到您的工作空间,如图18所示。
图18.选择一个工作空间
- 点击启动
- 所有输出将发送到两个日志文件。
- 系统错误将转到debugOutputErr.log文件。
- 系统输出将转到debugOutput.log文件,如清单7所示。
清单7. D:\ RAD6 \ eclipse \ debugUtil \ log \ debugOutput.log
################################################################################
Starting session: 7/17/2005--11:21:51.860
################################################################################
Install location:
file:/d:/RAD6/eclipse/
Configuration file:
file:/d:/RAD6/eclipse/configuration/config.ini loaded
Configuration location:
file:/d:/RAD6/eclipse/configuration/
Configuration file:
file:/d:/RAD6/eclipse/configuration/config.ini loaded
Framework located:
file:/d:/RAD6/eclipse/plug-ins/org.eclipse.osgi_3.0.1/
Loading framework classpath from:
file:/d:/RAD6/eclipse/plug-ins/org.eclipse.osgi_3.0.1/eclipse.properties
Loading extension: com.ibm.jxesupport
Framework classpath:
file:/d:/RAD6/eclipse/plug-ins/org.eclipse.osgi_3.0.1/core.jar
file:/d:/RAD6/eclipse/plug-ins/org.eclipse.osgi_3.0.1/console.jar
file:/d:/RAD6/eclipse/plug-ins/org.eclipse.osgi_3.0.1/osgi.jar
file:/d:/RAD6/eclipse/plug-ins/org.eclipse.osgi_3.0.1/resolver.jar
file:/d:/RAD6/eclipse/plug-ins/org.eclipse.osgi_3.0.1/defaultAdaptor.jar
file:/d:/RAD6/eclipse/plug-ins/org.eclipse.osgi_3.0.1/eclipseAdaptor.jar
file:/d:/RAD6/eclipse/plug-ins/com.ibm.jxesupport_1.3.6/jxesupport.jar
Debug options:
file:/D:/RAD6/eclipse/debugUtil/options/1124292111652.options loaded
Time to load bundles: 99
Starting application: 14041
Error querying the registry:The system cannot find the file specified.
Starting build of BuilderExample @ Wed Aug 17 11:25:31 EDT 2005
About to read state...
Successfully read state for BuilderExample
Found source delta for: BuilderExample
Clearing last state : State for BuilderExample (#4 @ Wed Aug 17 10:52:07 EDT 2005)
INCREMENTAL build
Compile this changed source file example/ExampleA.java
About to compile example/ExampleA.java
Writing changed class file ExampleA.class
Recording new state : State for BuilderExample (#5 @ Wed Aug 17 10:52:07 EDT 2005)
Finished build of BuilderExample @ Wed Aug 17 11:25:31 EDT 2005
Saving built state for project BuilderExample
Saved in 20 ms
################################################################################
Ending session: 7/17/2005--11:25:40.249
################################################################################
- 一旦Eclipse关闭,调试实用程序将收到进程退出代码的通知,如图19所示。
图19.流程终止
调试Eclipse
完成本文后,您现在应该可以使用WebSphere Studio和Rational Application Developer中可用的功能来调试Eclipse插件。 如您所见,该过程并不复杂。 另外,您可以使用调试实用程序将调试输出重定向到日志文件。
翻译自: https://www.ibm.com/developerworks/rational/library/06/0221_rossner/index.html