Debug视图允许您在工作台上管理正在调试和运行的程序,他显示了你正在调试的程序中挂起的线程的堆栈帧,程序中的每个线程作为树的节点出现。他展示了正在运行的每个目标的进程。如果线程被挂起,它的堆栈帧以子元素的形式展示。以下是一些常用的debug按钮:
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(F7):跳出当前方法,在被调用方法的执行过程中,使用Step Return
会在执行完当前方法的全部代码后跳出该方法返回到调用该方法的方法中。
Step Over(F6):在单步执行时,在函数内遇到子函数时不会进入子函数内单步执行,而是将子函数整个执行完在停止,也就是把子函数整个作为一步。
Step Into(F5):单步执行,遇到子函数就进入并且继续单步执行
Resume(F8):恢复暂停的线程,直接从当前位置跳到下一个断点位置。
Suspend:暂停选定的线程,这个时候可以进行浏览或者修改代码,检查数据等。
Eclipse通过Suspend与Resume来支持线程的暂挂与恢复。一般来讲,Suspend适用于多线程程序的调试,当需要查看某一个线程的堆栈帧及变量值时,我们可以通过Suspend命令将该线程暂挂。Resume用于恢复。有两种Resume需要注意:第一是当在调试过程中修改程序代码,然后保存,点击Resume,此时程序会暂挂于断点。第二是当程序抛出异常时,运行Resume,程序也会暂挂于断点。
Terminate:Eclipse通过Terminate
命令终止对本地程序的调试。
Disconnect:Eclipse使用Disconnect
命令来终止与远程JVM的socket连接。
Variables View
显示与Debug View
中选定的堆栈帧相关的变量信息,调试Java
程序时,变量可以选择将更详细的信息显示在详细信息窗格中。此外,Java
对象还可以显示出其包含的属性的值。在该窗口中选中变量鼠标右键点击可以进行许多操作,主要操作有以下这些:
All Instances:打开一个对话框来显示该java类的所有实例,使用该功能需要java虚拟机支持实例的检索。
All References::打开一个对话框来显示所有引用了该变量的java对象,
Change Value::更改变量的值,该功能可以和Drop to Frame
联合使用进行程序的调试。使用这两个功能就可以代替重新debug
Copy Variables:复制变量的值,尤其在变量值很长(比如json数据)的时候,这个功能就派上用场了。
Find:有的时候一个类中变量特别多的时候,可以进行查找。
Breakpoints View
将列出你在当前工作区间里设置的所有断点,双击断点可以进入到程序中该断点的位置。还可以启用或禁用断点,删除,添加新的,根据工作组或点命中计数给他们分组。在使用断点是有以下两个技巧是十分有用的:
Hit Count: 是指定断点处的代码段运行多少次,最典型的就是循环,如果要让一个循环执行10次就线程挂起,则指定Hit Count值为10,那么当前的循环执行到第九次的时候就会挂掉。
Conditional:顾名思义,就是条件判断,例如我们需要循环变量i==10时,线程挂起,则条件设定为i==10,选择Suspend when “true”。
那如果上面的Hit Count和Conditional都选择的话,如果表达式和值设置不合理则会实效。如果选择Suspend when value changes,那么可能在Conditional在变量值发生改变的时候就挂起。
要在 Debug 透视图的编辑器中求表达式的值,选中设置有断点的一整行,并在上下文菜单中选择 Inspect 选项。表达式是在当前堆栈帧的上下文中求值的,其结果显示在 Display 窗口的 Expressions 视图中。
可以使用这个视图,输入或者演算一些新的代码。这些代码在当前的调试位置的上下文环境中被执行,这意味着,你可以使用所有变量甚至是内容助手。要执行你的代码的话,只需标记它,并使用右键菜单或者CTRL+U(执行)或者 CTRL+SHIFT+I (检查).。
条件断点
在源代码文件中,在想要设置断点的代码行的前面的标记行处,双击鼠标左键就可以设置断点,在相同位置再次双击即可取消断点。有的时候我们还有这样的需要,就是我并不想一行一行的执行代码,比如一个for循环会循环1000多遍,我只想在第500遍的时候让线程挂起进行调试,这个时候我们可以使用条件断点。
设置条件断点:我们可以给该断点设置触发条件,一旦满足某条件是才开始调试,可以在断点处点击鼠标右键,选择Breakpoint Properties
进入断点设置页面,刚刚在讲断点视图的时候我们学到过Hit Count
和Conditional
的用法,这里可以设置条件和执行次数。
远程调试
在进行Java的web开发时,通常服务器都是在linux服务器上搭建的,不方便调试。那我们怎样在本地调试linux运行的程序呢?
首先得在linux中tomcat下进行相应的设置,具体在tomcat目录下calalina.sh,详见下图:
调试好远程debug端口后,在本地eclipse配置远程调试,点击debug图标出现下拉菜单,选择debug configration选项进入debug设置页面。或者选择要调试的项目,右键选择debug,在选择debug configuration选项也可以进去设置页面。