Eclipse调试Bug的七种常用技巧(转)

时间:2022-12-29 10:13:41
 
 
注意事项及小结:
(1)Line Breakpoint:
如果设置Conditional,监控的变量需要比当前行高一级block,譬如for(int i=0;i<20;i++)中的i,for循环内部可以对i设置条件
(2)Java Exception Breakpoint的监控范围是Class,不需要指定行,在Breakpoints面板右侧上的图标为J!
(3)Watchpoint:针对字段
(3)Method Breakpoint:与将Line Breakpoint设在方法中的第一行相同
 
大家肯定都用过Eclipse的调试的功能,在调试的过程中自然也无法避免要使用断点(breakpoint),但不知是否对Eclipse中各类断点都有所了解。本篇图文并茂地介绍了Eclipse中全部类型的断点,及其设置,希望对大家有所帮助。(2011.11.20)

1. 示例程序
BreakpointDemo是一个臆造的应用程序,只是为了便于讲解Eclipse中各类断点的使用罢了。其代码如下图所示,
Eclipse调试Bug的七种常用技巧(转)
BreakpointDemo主要包含两个方法:
[1]setValue,该方法根据指定的次数(count),对成员变量value进行赋值,值的范围为0-9的随机整数。
[2]printValue,该方法会调用setValue()对value进行赋值,并打印出value的值;但,如果value能被3整除,那么就会抛出IllegalArgumentException异常。

2. Line Breakpoint
Line Breakpoin是最简单的Eclipse断点,只要双击某行代码对应的左侧栏,就对该行设置上断点。此处,对第20行代码设置上Line Breakpoint,如下图所示,
Eclipse调试Bug的七种常用技巧(转)
可以为Line Breakpoint设置一个条件,那么当程序运行到该断点时,只有满足设定的条件,才会被中断。右键点击第20行的断点,选择"Breakpoint Properties..."
Eclipse调试Bug的七种常用技巧(转)
在弹出的属性对话框中,勾选上"Conditional",然后在文本框中输入"count % 2 == 0"。
Eclipse调试Bug的七种常用技巧(转)
该条件表示,当程序运行到第20行时,只有当count为偶数时,程序才会被中断。细心地话,你会发现该断点的图标发生了改变,多了一个问号。
Eclipse调试Bug的七种常用技巧(转)

3. Watchpoint
Line Breakpoint关注于程序运行的"过程",大家也常把使用这种断点的调试称为单步调试。但有时候,我们对程序的运行过程不太了解,可能也不太关心,不能确定在什么地方设置断点比较合适,而可能比较关注某个关键变量的变化或使用。此时,就可以为该变量设置一种特殊的断点--Watchpoint。在此示例,我们最关心的就是成员变量value的值,那么就可以为它设置一个Watchpoint,双击第9行代码对应的左侧栏就可以了。
Eclipse调试Bug的七种常用技巧(转)
使用在2中所提及的方法,查看该断点的属性,
Eclipse调试Bug的七种常用技巧(转)
默认地,当该变量被访问或它的值被修改时,程序都会被中断。但在本示例中,只希望当对value的值进行修改时程序才需要被中断,所以取消对"Access"的勾选。
Eclipse调试Bug的七种常用技巧(转)
这时,我们会发现原来的Watchpoin图标也有变化了。
Eclipse调试Bug的七种常用技巧(转)

4. Method Breakpoint
与关注对某个变量的访问与修改一样,我们也可以关注程序对某个方法的调用情况,即,可以设置Method Breakpoint。在此处,设置针对方法setValue的Method Breakpoint。同理,双击第11行代码对应的左侧栏即可。
Eclipse调试Bug的七种常用技巧(转)
仍然要查看该断点的属性。默认地,只勾选了"Entry",而没有勾选"Exit"。
Eclipse调试Bug的七种常用技巧(转)
这表示,当刚进入该方法(调用开始)时,程序会被中断;而离开该方法(调用结束)时,程序并不会被中断。在本示例中,需要同时勾选上"Exit"。
Eclipse调试Bug的七种常用技巧(转)
点击OK之后,可以看到该断点的图标也有所改变。
Eclipse调试Bug的七种常用技巧(转)
根据这里的设置,当程序运行到第20行后会在第12行被中断,尽管这里没有显式的断点,但这就是setValue()方法的入口(Entry)。必须注意地是,程序在运行到第16行时不会被中断,尽管它看起来像是setValue()方法的出口(Exit)。实际上,程序会在第17行被中断,这里才是setValue()调用结束的地方。

5. Exception Breakpoint
如果,我们期望某个特定异常发生时程序能够被中断,以方便查看当时程序所处的状态。通过设置Exception Breakpoint就能达到这一目标。本示例故意在第23行抛出了IllegalArgumentException异常,我们期望程序运行到此处时会被中断。但我们不直接为此行代码设置Line Breakpoint,而是为IllegalArgumentException设置Exception Breakpoint。设置Exception Breakpoint的方法与其它类型断点都不同,它不能通过双击左侧栏的方式在代码编辑器上直接进行设置。点击Breakpoints视图右上角形如Ji的图标,
Eclipse调试Bug的七种常用技巧(转)
会弹出如下所示的对话框,
Eclipse调试Bug的七种常用技巧(转)
在其中选中IllegalArgumentException,并点击OK,这时一个Exception Breakpoint就设置好了。
Eclipse调试Bug的七种常用技巧(转)

当value为3的倍数时,程序会在第23行被中断,这时我们就能使用调试器来看看value具体是等于0,3或6。

6. Class Load Breakpoint
还有一种大家平时可能不太用的断点--Class Load Breakpoint,即当某个类被加载时,通过该断点可以中断程序。
Eclipse调试Bug的七种常用技巧(转)

小结
上述的Eclipse断点,我们在现实工作中肯定都有意或无意地使用过其中的几种,只是不一定十分了解内情罢了。使用好Eclipse的各种断点,可以把很好地帮助我们分析程序,定位问题。

 
 
摘要:本篇文章主要介绍了Eclipse在调试代码时用到的几种调试方法,并附于截图方便理解。

  本文写给那些像几年前的我一样刚刚走出校门,及一些未使用过这些高级些的调试技巧的人。

  记得刚刚毕业的时候,自己连断点也不会打,当时还在用JCreate ,就连毕业设计也是用 System.out 找 Bug 的,想想真的很笨。开始工作后,一个星期过去了,在一个 1 、 2 百万行的系统中找 Bug ,我依然在用 System.out ,当时最痛苦的就是修改代码,每次找到疑似 Bug ,就输出一下,然后重启(那时也不知道代码热替换),直到有一天带我的导师发现了这样笨笨的调试 Bug ,才让我第一次认识了断点,也知道了代码修改完了可以进行热替换,我这个中国教育的半牺牲品才算向美好生活迈进了一小步。

  1、 条件断点

  断点大家都比较熟悉,在EclipseJava 编辑区的行头双击就会得到一个断点,代码会运行到此处时停止。

条件断点,顾名思义就是一个有一定条件的断点,只有满足了用户设置的条件,代码才会在运行到断点处时停止。

  在断点处点击鼠标右键,选择最后一个"BreakpointProperties"

Eclipse调试Bug的七种常用技巧(转)

  断点的属性界面及各个选项的意思如下图,

Eclipse调试Bug的七种常用技巧(转)

  2、 变量断点

  断点不仅能打在语句上,变量也可以接受断点,

Eclipse调试Bug的七种常用技巧(转)

  上图就是一个变量的打的断点,在变量的值初始化,或是变量值改变时可以停止,当然变量断点上也是可以加条件的,和上面的介绍的条件断点的设置是一样的。

  3、 方法断点

  方法断点就是将断点打在方法的入口处,

Eclipse调试Bug的七种常用技巧(转)

  方法断点的特别之处在于它可以打在 JDK的源码里,由于 JDK 在编译时去掉了调试信息,所以普通断点是不能打到里面的,但是方法断点却可以,可以通过这种方法查看方法的调用栈。

  4、 改变变量值

  代码停在了断点处,但是传过来的值不正确,如何修改一下变量值保证代码继续走正确的流程,或是说有一个异常分支老是进不去,能不能调试时改一下条件,看一下异常分支代码是否正确?

  在Debug 视图的 Variables 小窗口中,我们可以看到 mDestJarName 变量的值为 " F:\Study\eclipsepro\JarDir\jarHelp.jar "

Eclipse调试Bug的七种常用技巧(转)

  我们可以在变量上右键,选择"ChangeValue..." 在弹出的对话框中修改变量的值,

Eclipse调试Bug的七种常用技巧(转)

  或是在下面的值查看窗口中修改,保用Ctr+S 保存后,变量值就会变成修改后的新值了。

Eclipse调试Bug的七种常用技巧(转)

  5、 重新调试

  这种调试的回退不是万能的,只能在当前线程的栈帧中回退,也就说最多只能退回到当前线程的调用的开始处。

  回退时,请在需要回退的线程方法上点右键,选择 "DroptoFrame"

Eclipse调试Bug的七种常用技巧(转)

  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】

  F:\Study\eclipsepro\screensnapjava -Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=8000 -jar screensnap3.jar

  连接时远程服务器时,需要在Eclipse中新建一个远程调试程序

Eclipse调试Bug的七种常用技巧(转)

  这里有一个小地方需注意,连接上的时候貌似不能自动切换到Debug视图,不要以为本机的调试程序没有连接到服务器端。

  本机作为服务端

  同本机作为客户端相比,只需要修改一下Connection Type

Eclipse调试Bug的七种常用技巧(转)

  这时Eclipse会进入到等待连接的状态

Eclipse调试Bug的七种常用技巧(转)

  连接程序使用如下参数即可连接本机服务器,IP地址请用实现IP替换~~

  【-agentlib:jdwp=transport=dt_socket,suspend=y,address=127.0.0.1:8000】

  F:\Study\eclipsepro\screensnapjava -agentlib:jdwp=transport=dt_socket,suspend=y,address=127.0.0.1:8000 -jar screensnap3.jar

  远程调试时本地的代码修改可同步到远程,但不会写到远程的文件里,也就是说本地修改会在下次启动远程程序时就没有了,不会影响到下次使用时的远程代码。

  7、异常断点

  经常遇见一些异常,然后程序就退出来了,要找到异常发生的地方就比较难了,还好可以打一个异常断点,

Eclipse调试Bug的七种常用技巧(转)

  上图中我们增加了一个NullPointException的异常断点,当异常发生时,代码会停在异常发生处,定位问题时应该比较有帮助。

http://kb.cnblogs.com/page/91820/