挂起和恢复线程
调试开始后,开发人员可以将正在执行的线程挂起,以便查看该线程堆栈帧的信息,步骤如下。
(1)在调试视图选择线程。
(2)在调试视图的工具栏点击“挂起”按钮,线程将被挂起,调试视图显示当前线程的调用堆栈(如下图所示),并且调试视图中的编辑器也会突出显示该堆栈帧对应的代码,这行代码就是线程被挂起那一刻程序运行到的地方。
线程挂起时会自动选择线程顶部的堆栈帧(即最近被调用的方法),变量视图将会显示堆栈帧中的变量以及它的值,复杂的变量可以被展开以便查看其成员的值。开发者也可以在调试视图的调用堆栈帧里选择一个方法调用,该方法的变量信息将会在变量视图展示出来。
线程挂起时,将鼠标移到Java编辑器里的某个变量之上,就会显示该变量的值。
线程既可以被挂起,也可以恢复执行。
(1)在调试视图选择线程或它的堆栈帧。
(2)在调试视图的工具栏里点击“继续”按钮(或者按F8),线程恢复执行。
单步执行程序
线程被挂起后,可以使用“单步执行”逐行执行程序。如果在这个过程中遇到断点,那么将在断点处挂起并且终止单步执行。
单步执行程序时有一下几种操作。
(1)“单步跳过”。F6。
(2)“单步进入”。F5。
(3)“单步跳入选择的内容”。在Java编辑器里将光标覆盖希望进入的方法的名字,按Ctrl+F5,程序运行直至已选择的方法被调用。
(4)“单步执行过滤器”。避免在调试过程中出现中断的情况。这中中断是由于在没有源代码的情况下使用单步执行进入调用方法代码而导致的。中断发生时,会弹出一个窗口,要求输入源代码的位置。在使用只包含类文件的代码库时会发生这种情况。调试器不会单步进入过滤器中设置的任何包和类。
要设置单步执行过滤器,点击菜单Window->Preferences->Java->Debug->Step Filtering,如下图所示。在右边的窗口窗口中可以添加类、包以及过滤器,还可以启用或是禁用过滤器。
(5)如果已经进入了方法调用,并且看到了期望的结果,并且希望尽快从该方法返回,可以使用“单步返回”(F7)。
(6)一个线程被挂起后,可以让它恢复执行一直到某一行,这样可以让程序运行到某一行而不需要设置断点。选择需要运行到的那一行,然后使用快捷键Ctrl+R。
表达式的计算和显示
当JVM挂起一个线程(由于遇到断点或单步执行),就可以在堆栈帧的上下文中计算表达式。缺省情况下,表达式视图位于调试视图的右上角,它与断点视图、变量视图等视图共享一个窗格。表达式视图的使用如下。
(1)选择要在其中求值的堆栈帧。对于变量和表达式视图而言,value由变量的上下文决定。
(2)点击空白区域,显示结果。
查看和修改变量的值
对于简单的变量,只需要在Java编辑器中将鼠标移到变量名上即可。
如果要查看复杂变量的值,可以使用变量视图。变量视图显示当前范围内(即堆栈帧的上下文)的所有变量。
使用变量视图还可以修改变量的值,可以直接单击value值进行修改,也可以在变量所在的那一行上右击,并在弹出的菜单中选择“Change Value ...”。
断点
可以为程序的可执行代码(即没有注释掉的代码)添加行断点,在有断点的那一行代码执行之前,线程就会被挂起,调试器会自动选择被挂起的线程,并且将线程堆栈里的信息在调试视图里显示出来。而在调试视图的编辑中,设置断点的那一行会被突出显示。
1.方法断点
在Java程序里,它适用于类文件(即.class文件)。添加方法断点的步骤如下。
(1)在大纲视图打开一个类,选择一个想要加入方法断点的方法。
(2)右击并在弹出的菜单里选择“Toggle Method Breakpoint”。
(3)添加断点之后,如果这个类的源文件存在,会在文件编辑器的标记栏里显示被选择的方法的断点。
(4)当进入该方法的那一刻,在调用该方法的任何代码执行之前,线程就被挂起。
2.条件断点
可以为断点设定条件,以便断点在遇到以下情况才会使线程挂起。
(1)当条件成立的情况下。
(2)当条件发生变化的情况下。
为一个断点设定条件的步骤如下:
(1)找到需要设定条件的断点。
(2)右击该断点,在弹出的菜单中选择“Breakpoint Properties...”,弹出如下图所示的窗口。
(3)在属性菜单选择“Conditional”后,在文本区域输入条件表达式。
(4)如果希望每次条件为真时,断点都会使线程挂起,那么就要选择“Suspend when ‘true‘”;如果希望在根据条件判断的结果改变时才使线程挂起,就要选择另一项。
(5)点击“OK”完成条件断点的设置。
由上图可以看到,还有一个“Hit count”的选项。该选项适用于行断点、异常断点、检查点以及方法断点。断点启用“Hit count”后,“Hit count”就开始工作。线程运行经过该断点n次(即设定的次数)后,线程就会被挂起。但是这个“Hit count”只能作用一次,除非它被再次启用或更改命中次数。
异常断点
通过异常断点,可以在抛出异常时挂起线程;可以在捕获异常的地方挂起线程;可以在未捕获异常的地方挂起;还可以在捕获和未捕获异常的地方都挂起执行。设置Java异常断点的步骤如下:
(1)在断点视图或者是工作台“Run”菜单里,选择“Add Java Exception Breakpoint”。在出现的窗口中会列出所有可用的异常,如下图所示。
(2)输入或从列表中选择一个希望捕获的异常。在该窗口的底部,选择希望在什么地方挂起线程。