ECLIPSE远程调试文档Word文档格式.docx
《ECLIPSE远程调试文档Word文档格式.docx》由会员分享,可在线阅读,更多相关《ECLIPSE远程调试文档Word文档格式.docx(23页珍藏版)》请在冰豆网上搜索。
中级
ChrisAniszczyk(zx@),软件工程师,IBM
PawelLeszek(pawel.leszek@ipgate.pl),独立软件顾问,Freelance
2007年5月31日
通过本文了解如何使用Eclipse平台的内置功能来调试软件项目。
调试是编程人员必须面对的工作。
调试的方法有很多种,但是归根结底,就是找出有bug的代码。
例如,Linux®
应用程序中最常见的一个错误就是段错误(segmentationfault)。
在程序试图访问没有分配给它的内存时,会因为段越界而终止,这时就发生了这个错误。
为了修复这类错误,需要找到触发错误的那行代码。
找到出现问题的代码以后,了解发生错误的上下文、相关值、变量和方法也很有用。
使用调试器找出这些信息非常简单。
编者注:
PawelLeszek最初于2003年5月撰写了下文,后来由ChrisAniszczyk于2007年4月进行了更新。
Eclipse调试器和Debug视图
EclipseSDK是针对Java™开发工具(Java™DevelopmentTools,JDT)的项目,它具有一个内置的Java调试器,可以提供所有标准的调试功能,包括分步执行、设置断点和值、检查变量和值、挂起和恢复线程的功能。
除此之外,还可以调试远程机器上运行的应用程序。
Eclipse平台很健壮,因为其他编程语言可以将该平台提供的调试工具用于各自的语言运行时。
正如下文所示,同一个EclipseDebug视图也可以用于C/C++编程语言。
Eclipse平台工作台及其工具是围绕JDT组件构建的,该组件为Eclipse提供了下列特性:
∙项目管理工具
∙透视图和视图
∙构造器、编辑器、搜索和构建功能
∙调试器
Eclipse调试器本身是Eclipse内的一个标准插件集。
Eclipse还有一个特殊的Debug视图,用于在工作台中管理程序的调试或运行。
它可以显示每个调试目标中挂起线程的堆栈框架。
程序中的每个线程都显示为树中的一个节点,Debug视图显示了每个运行目标的进程。
如果某个线程处于挂起状态,其堆栈框架显示为子元素。
在使用Eclipse调试器之前,假定您已经安装了合适的JavaSDK/JRE(我推荐使用JavaVMV1.4)和EclipsePlatformSDKV3.3,而且两者的运行都没问题。
一般来说,先用Eclipse示例测试一下调试选项比较好。
如果想开发和调试C/C++项目,还需要获得并安装C/C++开发工具(C/C++DevelopmentTools,CDT)。
关于JavaSDK/JRE、Eclipse平台和示例以及CDT,请参阅参考资源。
图1显示了Debug透视图的一般视图。
图1.EclipseDebug透视图的一般视图
调试Java语言程序
在可以调试项目前,需要干净地编译和运行代码。
首先,需要为应用程序创建一个运行配置,确保应用程序可以正确启动。
然后,需要通过Run>
Debug菜单以类似的方式设置调试配置。
还需要选择一个类,将它作为调试的主Java类来使用(请参见图2)。
您可以按照自己的意愿为单个项目设置多个调试配置。
当调试器启动时(从Run>
Debug),会在一个新的窗口中打开,这时就可以开始调试了。
图2.在调试配置中设置项目的主Java类
接下来,将讨论Eclipse中的一些常用调试实践。
设置断点
在启动应用程序进行调试时,Eclipse会自动切换到Debug透视图。
毫无疑问,最常见的调试步骤是设置断点,这样可以检查条件语句或循环内的变量和值。
要在Java透视图的PackageExplorer视图中设置断点,双击选择的源代码文件,在一个编辑器中打开它。
遍历代码,将鼠标放在可疑代码一行的标记栏(在编辑器区域的左侧)上,双击即可设置断点。
图3.编辑器左侧看到的两个断点
现在,从Run>
Debug菜单启动调试会话。
最好不要将多条语句放在一行上,因为会无法单步执行,也不能为同一行上的多条语句设置行断点。
图4.视图中左侧空白处的箭头指示当前正在执行的行
还有一个方便的断点视图来管理所有的断点。
图5.断点视图
条件断点
一旦了解到错误发生的位置,您可能想要知道在程序崩溃之前,程序在做什么。
一种方法就是单步执行程序的每行语句。
一次执行一行,直到运行到可疑的那行代码。
有时,最好只运行一段代码,在可疑代码处停止运行,在这个位置检查数据。
还可以声明条件断点,它在表达式值发生变化时触发(请参见图6)。
除此之外,在输入条件表达式时,也可以使用代码帮助。
图6.设置条件断点触发器
计算表达式的值
为了在Debug透视图的编辑器中计算表达式的值,选择设置了断点的那行代码,在上下文菜单中,通过Ctrl+Shift+I或右键单击您感兴趣的变量(参见图7)选择Inspect选项。
在当前堆栈框架的上下文中会计算表达式的值,在Display窗口的Expressions视图中会显示结果。
图7.通过Inspect选项计算表达式的值
剪切活动代码
Display视图允许您以剪切类型的方式处理活动代码(参见图8)。
要处理一个变量,在Display视图中输入变量名即可,视图会提示您一个熟悉的内容助手。
图8.Display视图
当调试器停止在一个断点处时,您可以从Debug视图工具栏(参见图9)中选择StepOver选项,继续调试器会话。
该操作会越过高亮显示的那行代码,继续执行同一方法中的下一行代码(或者继续执行调用当前方法的那个方法的下一行代码)。
执行上一步后发生改变的变量会用某种颜色高亮显示(默认是黄色)。
颜色可以在调试首选项页面中改变。
图9.改变颜色的变量
要在Debug视图中挂起执行线程,选择一个运行线程,单击Debug视图工具栏中的Suspend。
该线程的当前调用堆栈就会显示出来,当前执行的代码行就会在Debug透视图中的编辑器中高亮显示。
挂起一个线程时,将鼠标放在Java编辑器中的变量上,该变量的值就会在一个小的悬停窗口中显示出来。
此时,该线程的顶部堆栈框架也会自动选中,其中的可视变量也会在Variables视图中显示出来。
您可以通过单击Variables视图中合适的变量名来检查变量。
热交换错误修正:
动态代码修正
如果运行的是Java虚拟机(JavaVirtualMachine,JVM)V1.4或更高的版本,Eclipse支持一个叫做热交换错误修正(HotswapBugFixing)的功能,JVMV1.3或更低的版本不支持该功能。
该功能允许在调试器会话中改变源代码,这比退出应用程序、更改代码、重新编译、然后启动另一个调试会话更好。
要利用该功能,在编辑器中更改代码后重新调试即可。
由于JVMV1.4与Java平台调试器架构(JavaPlatformDebuggerArchitecture,JPDA)兼容,所以才有可能具备该功能。
JPDA实现了在运行的应用程序中替换经过修改的代码的功能。
如果应用程序启动时间较长或执行到程序失败的地方时间很长,那么这一点特别有用。
如果在完成调试时,程序还没有全部执行一遍,在Debug视图的上下文菜单中选择Terminate选项。
容易犯的一个错误是在调试器会话中使用Debug或Run,而不是Resume。
这样做会启动另一个调试器会话,而不是继续当前会话。
回页首
远程调试
Eclipse调试器提供了一个有趣的选项,可以调试远程应用程序。
它可以连接到一个运行Java应用程序的远程VM,将自己连接到该应用程序上去。
使用远程调试会话与使用本地调试会话大致相同。
但是,远程调试配置需要在Run>
Debug窗口中配置一些不同的设置。
需要在左侧视图中先选择RemoteJavaApplication选项,然后单击New。
这样就创建了一个新的远程启动配置,会显示出三个选项卡:
Connect、Source和Common。
在Connect选项卡的Project字段,选择在启动搜索源代码时要引用的项目。
在Connect选项卡的Host字段,输入运行Java程序的远程主机的IP地址或域名。
在Connect选项卡的Port字段,输入远程VM接收连接的端口。
通常,该端口在启动远程VM时指定。
如果想让调试器决定在远程会话中Terminate命令是否可用,可以选择AllowterminationofremoteVM选项。
如果希望可以终止连接的VM,则选择该选项。
现在,在您选择Debug选项时,调试器会尝试连接到指定地址或端口的远程VM,结果会在Debug视图中显示出来。
如果启动程序不能连接到指定地址的VM,会出现一条错误信息。
通常来说,是否可以使用远程调试功能完全取决于远程主机上运行的JavaVM。
图10显示了一个远程调试会话的连接属性设置。
图10.设置一个远程调试会话的连接属性
调试其他语言
尽管Java语言是Eclipse使用的最广泛的语言,但是Eclipse是一个可扩展的平台,可以支持许多其他的语言。
Eclipse可以通过C/C++开发工具(CDT)支持C/C++。
CDT扩展了标准的EclipseDebug视图,添加了调试C/C++代码的功能,CDTDebug视图可以在工作台中管理C/C++项目的调试过程。
CDT中没有内部的调试器,但是它提供了一个GNUGDB调试器的前端,该调试器必须在本地可用。
还有其他项目可以提供各自的调试器,例如PHP开发工具(PHPDevelopmentTools,PDT),请参见图11。
图11.PHP调试器
结束语
Eclipse平台提供了一个内置Java语言调试器,它带有标准的调试功能,包括分步执行、设置断点和值、检查变量和值以及挂起和恢复线程功能。
它还可以用来调试运行在远程机器上的应用程序。
Eclipse平台主要是一个Java开发环境,但是其中的EclipseDebug视图还可以用于C/C++、PHP和许多其他的编程语言。
发表于:
2008-08-03,修改于:
2008-08-0315:
27,已浏览428次,有评论0条推荐投诉
给我留言
版权所有ChinaU页面生成时间:
0.09494
本文写给那些像几年前的我一样刚刚走出校门,及一些未使用过这些高级些的调试技巧的人。
记得刚刚毕业的时候,自己连断点也不会打,当时还在用JCreate,就连毕业设计也是用System.out找Bug的,想想真的很笨。
开始工作后,一个星期过去了,在一个1、2百万行的系统中找Bug,我依然在用System.out,当时最痛苦的就是修改代码,每次找到疑似Bug,就输出一下,然后重启(那时也不知道代码热替换),直到有一天带我的导师发现了这样笨笨的调试Bug,才让我第一次认识了断点,也知道了代码修改完了可以进行热替换,我这个中国教育的半牺牲品才算向美好生活迈进了一小步。
1、条件断点
断点大家都比较熟悉,在EclipseJava编辑区的行头双击就会得到一个断点,代码会运行到此处时停止。
条件断点,顾名思义就是一个有一定条件的断点,只有满足了用户设置的条件,代码才会在运行到断点处时停止。
在断点处点击鼠标右键,选择最后一个"
BreakpointProperties"
断点的属性界面及各个选项的意思如下图,
2、变量断点
断点不仅能打在语句上,变量也可以接受断点,
上图就是一个变量的打的断点,在变量的值初始化,或是变量值改变时可以停止,当然变量断点上也是可以加条件的,和上面的介绍的条件断点的设置是一样的。
3、方法断点
方法断点就是将断点打在方法的入口处,
方法断点的特别之处在于它可以打在JDK的源码里,由于JDK在编译时去掉了调试信息,所以普通断点是不能打到里面的,但是方法断点却可以,可以通过这种方法查看方法的调用栈。
4、改变变量值
代码停在了断点处,但是传过来的值不正确,如何修改一下变量值保证代码继续走正确的流程,或是说有一个异常分支老是进不去,能不能调试时改一下条件,看一下异常分支代码是否正确?
在Debug视图的Variables小窗口中,我们可以看到mDestJarName变量的值为"
F:
\Study\eclipsepro\JarDir\jarHelp.jar"
我们可以在变量上右键,选择"
ChangeValue..."
在弹出的对话框中修改变量的值,
或是在下面的值查看窗口中修改,保用Ctr+S保存后,变量值就会变成修改后的新值了。
5、重新调试
这种调试的回退不是万能的,只能在当前线程的栈帧中回退,也就说最多只能退回到当前线程的调用的开始处。
回退时,请在需要回退的线程方法上点右键,选择"
DroptoFrame"
6、远程调试
用于调试不在本机上的程序,有两种方式,
1、本机作为客户端
2、本机作为服务端
使用远程调试的前提是服务器端和客户端的代码是一致的。
本机作为客户端
本机作客户端比较常用,需要在远端的服务器上的java程序在启动时打开远程调试开关,
服务器端需要加上虚拟机参数
1.5以前版本(1.5以后也可用):
【-Xdebug-Xrunjdwp:
transport=dt_socket,server=y,address=8000】
1.5及以上版本:
【-agentlib:
jdwp=transport=dt_socket,server=y,address=8000】
\Study\eclipsepro\screensnap>
java-Xdebug-Xrunjdwp:
transport=dt_socket,server=y,address=8000-jarscreensnap3.jar
连接时远程服务器时,需要在Eclipse中新建一个远程调试程序
这里有一个小地方需注意,连接上的时候貌似不能自动切换到Debug视图,不要以为本机的调试程序没有连接到服务器端。
本机作为服务端
同本机作为客户端相比,只需要修改一下“ConnectionType”
这时Eclipse会进入到等待连接的状态
连接程序使用如下参数即可连接本机服务器,IP地址请用实现IP替换~~
【-agentlib:
jdwp=transport=dt_socket,suspend=y,address=127.0.0.1:
8000】
java-agentlib:
8000-jarscreensnap3.jar
远程调试时本地的代码修改可同步到远程,但不会写到远程的文件里,也就是说本地修改会在下次启动远程程序时就没有了,不会影响到下次使用时的远程代码。
有关远程调试更详细点的介绍请参考【使用Eclipse远程调试Java应用程序】
好像漏了一个断点,异常断点,补一下。
7、异常断点
经常遇见一些异常,然后程序就退出来了,要找到异常发生的地方就比较难了,还好可以打一个异常断点,
上图中我们增加了一个NullPointException的异常断点,当异常发生时,代码会停在异常发生处,定位问题时应该比较有帮助。