Eclipse的Debug调试技巧
Eclipse是众多Java程序员实用的开发工具,其中开发技巧也是繁多,但作为优秀的Java程序员,需要掌握最起码的调试技巧。调试可以帮助识别和解决应用程序缺陷,在本文中,作者将使用大家常用的的开发工具Eclipse来调试Java应用程序。
一、Debug视图
代码调试过程中,最常用的视图通常如下
窗口 | 说明 |
---|---|
Debug窗口 | 主要显示当前线程方法调用栈, 以及代码行数(有调试信息的代码) |
断点Breakpoints窗口 | 断点列表窗口,可以方便增加断点,设置断点条件,删除断点等 |
变量Variables窗口 | 显示当前方法的本地变量,非static方法,包含this应用,可以修改变量值 |
代码编辑窗口 | 编辑代码 |
输出Console窗口 | 日志等输出内容,调试时,可以将关注的组件级别设置低一点,以便获得跟多输出信息 |
另外辅助的窗口有:
窗口 | 说明 |
---|---|
表达式expression窗口 | 写上自己需要观察的数据的表达式,或者修改变量值 |
Display窗口 | 可以在display中执行代码块,输出内容等 |
大纲Outline窗口 | 查看当前类的方法,变量等 |
类型层级Type hierarchy窗口 | 查看当前所在类的继承层次,包括实现接口,类继承层次 |
方法调用关系Call hierarchy窗口 | 查看当前方法被哪些方法调用,调用方法在哪些类中、第几行,可以直接打开对应的方法 |
搜索结果Search窗口 | 结合快捷键可以查看变量、方法等在工作空间、项目、工作集中被引用或定义的代码位置 |
二、DEBUG按钮
debug视图允许您在工作台上管理正在调试和运行的程序,他显示了你正在调试的程序中挂起的线程的堆栈帧,程序中的每个线程作为树的节点出现。他展示了正在运行的每个目标的进程。如果线程被挂起,它的堆栈帧以子元素的形式展示。以下是一些常用的debug按钮:
1.表示当前实现继续运行直到下一个断点,快捷键为F8。
2.表示打断整个进程
3.表示进入当前方法,快捷键为F5。
4.表示运行下一行代码,快捷键为F6。
5.表示退出当前方法,返回到调用层,快捷键为F7。
6.表示当前线程的堆栈,从中可以看出在运行哪些代码,并且整个调用过程,以及代码行号
2.1 详细介绍:
Skip All Breakpoints : 将所有断点设置为被跳过的,设置了Skip All Breakpoints之后,所有断点上都会有一个斜线,表示断点将被跳过,线程不会在该断点处被挂起。
Drop to Frame : 这个命令可以让程序回到当前方法的开头第一行重新开始执行,可以重新执行这个java堆栈帧,可以选择一个指定的堆栈帧,然后点击 Drop to Frame,这样就可以重新进入指定的堆栈帧。使用Drop to Frame时候需要注意:
1.不能drop到已经执行过的方法栈中的方法中。 2.drop到stack frame中时,不会改变全局数据原有的值,比如,一个包含元素的vertor并不会被清空。
Step Filters : 这个功能比较简单,就是当我们在debug的时候想要忽略一些我们不关注的类时,可以开启Step Filters进行过滤,程序会一直执行直到遇到未经过滤的位置或断点。Step Filters功能由Use Step Filters,Edit Step Filters,Filter Type,Filter Package四项组成。具体操作如下:
步骤 1: Windows -> Preferences -> Java -> Debug -> Step Filtering.
步骤 2:选择‘Use Step Filters’
步骤 3:在屏幕上选中所需的选项。你可以添加你自己代码库中的部分代码。
步骤 4:点击‘Apply’
原理上,Edit Step Filter命令用于配置Step Filter规则,而Filter Type与Filter Package分别指的是过滤的Java类型与Java Package。
Step Return : 跳出当前方法,在被调用方法的执行过程中,使用Step Return会在执行完当前方法的全部代码后跳出该方法返回到调用该方法的方法中。
Step Over : 在单步执行时,在函数内遇到子函数时不会进入子函数内单步执行,而是将子函数整个执行完在停止,也就是把子函数整个作为一步。
Step Into:单步执行,遇到子函数就进入并且继续单步执行。
Resume:恢复暂停的线程,直接从当前位置跳到下一个断点位置。
Suspend:暂停选定的线程,这个时候可以进行浏览或者修改代码,检查数据等。
Eclipse通过Suspend与Resume来支持线程的暂挂与恢复。一般来讲,Suspend适用于多线程程序的调试,当需要查看某一个线程的堆栈帧及变量值时,我们可以通过Suspend命令将该线程暂挂。Resume用于恢复。
有两种Resume需要注意:
第一是当在调试过程中修改程序代码,然后保存,点击Resume,此时程序会暂挂于断点。
第二是当程序抛出异常时,运行Resume,程序也会暂挂于断点。
Terminate : Eclipse通过Terminate命令终止对本地程序的调试。
Disconnect:Eclipse使用Disconnect命令来终止与远程JVM的socket连接。
三、常用调试方法
1.条件断点
如果你不知道如何添加断点,只需点击左边面板(行号前面)断点即被创建。在调试界面中,“断点”视图会把所有被创建的断点列出来。我们可以给它加一个布尔条件,也就是说,该断点会被激活并且如果布尔条件为真,就会执行该断点,否则将会跳过往下执行。
2.异常断点
在断点视图中,有一个J!标记按钮!我们可以使用该按钮来添加一个Java异常断点。例如,我们想让程序在遇到空指针异常(NullPointerException)时,仍然能继续调试,那么我们可以使用该按钮来添加一个异常断点!
3.监视点
这是一个非常好的功能,当选定的属性访问或修改程序时,程序会停止执行并允许进行调试。在Outline视图中选择一个类变量并从上下文菜单中选择切换监视点,属性监视点将会被创建,在断点(Breakpoints)视图中会把所有监视点用列表的形式显示出来。
4.评估/检查
按Ctrl+Shift+D或者Ctrl+Shift+I来显示选定变量或者表达式的值。我们也可以给一个变量或表达式添加永久观察点,当程序在调试时,这些观察点就会在表达式视图(Expression view)中显示出来。
5.修改变量值
在调试过程中,我们可以修改变量值。先选好一个变量然后进入变量视图(Variables view),根据变量类型在其对应的Value列里输入值即可。
6.在Main函数里面停止执行
在运行/调试设置中,编辑配置对话框中有“Main”这个选项卡,我们可以勾选“Stop in main”这个复选框。如果选中,那么在调试一个基于main方法的Java程序时,程序会在main方法第一行位置便停止执行。
7.环境变量
并不是在系统属性中添加环境变量,我们可以在编辑配置对话框中很方便地进行添加。
8.Drop to Frame
调试期间,可以重新跳到调用堆栈框架的开始处执行,并且变量值也会回到最初。根据回档调整堆栈的深度,这个功能的主要用途是所有变量状态可以快速回 到方法开始执行时候的样子,然后你可以重新进行一遍一遍执行,这样就可以在你关注的地方进行多次调试,但是在执行过程中也会产生一些副作用,比如插入到数据库里面的数据是无法删除的!
9.分布过滤
当我们进入(F5)方法的时候,我们还可以访问其外部库(比如JAVA),我们可能不需要这个库,就可以在Perference选项卡页面添加一个过滤器来排除这个包。
作者:鳌夜
链接:https://juejin.cn/post/7025139362685779998