转载请注明出处

作者:晓渡
文章地址:https://greatestrabit.github.io/2016/06/23/debug/

对于使用Eclipse进行日常编程工作的工程师来说,调试是每天都在进行的工作.针对一般意义上的调试过程,相信每一位工程师朋友都熟练掌握了.这里介绍几个调试中比较实用的高级功能.

远程调试

由于部署环境的差异性,相信很多朋友都碰到过开发环境正常测试过的功能在测试环境甚至生产环境下出现bug的情况.一般情况下,生产环境可以采取的手段比较单一,即通过日志的方式获取运行中的环境上下文,分析日志文件并尝试重现bug.这会带来的问题还是不少的.首先,日志的分析是一项比较耗时的工作;其次,现有的日志记录不一定能反映出问题,你可能需要多次重复这个过程(分析日志->猜测问题->加日志->部署->获取日志)来慢慢逼近问题.倘若是测试环境,我们还多了一项可供选择的手段,即远程调试:将程序在测试环境中以debug模式启动,在本机使用Eclipse在工程中设置断点进行调试.

1.将测试环境中的程序以debug模式启动

倘若是独立JavaSE程序,只需要在启动时增加几个参数即可.
java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=11111,suspend=y -jar calc.jar
若正常启动,你将看到以下画面:
remote debug server

2.使用Eclipse进行远程调试

在Eclipse中的对应工程中配置调试属性,如下:
remote debug client

3.开始远程调试

点击上一步中图中的Debug按钮开始调试.
一切正常的话,你就可以像调试本地程序一样开始调试测试环境上的程序了.

4.需要注意的问题

  1. 如果程序需要接收来自控制台的输入,应该在测试环境中的控制台中输入.
  2. 需要注意测试环境的代码和开发环境中不一致的情况.如果Eclipse中设置的断点的行数刚好对应测试环境程序中的空行,将无法跳入断点,看上去就像调试并没有成功一样.这种情况并不会发生在本地调试中,因为本地调试无法在空行上设置断点.下面是一个代码不一致的例子.
    实际代码对比:
    debugcode
    运行后的效果如下:
    remote debugging
    注意对比2处和3处,在3处本应该有的变量index在2处并没有出现.

    5.tomcat远程调试

    对tomcat进行远程调试是需要将tomcat以debug模式启动,启动命令为(假定用户已经在tomcat/bin目录下):
    ./catalina.sh jpda start
    需要注意的是,最新版本的tomcat对调试的监听地址进行了限制,只允许127.0.0.1访问,所以如果在非本地机器上调试的话,需要修改设置:
    remote debug tomcat
    将图中的JPDA_ADDRESS变量由原来的127.0.0.1:8000修改为8000.
    Eclipse端的设置和第2步中的设置没有区别.

    条件断点

    如果需要对循环中的数据进行调试,使用条件断点是个不错的选择.将断点设置在指定的位置上,右键进一步设置断点属性,如下:
    condition debug
    调试时,程序会中断在符合条件处.

    异常断点

    断点不仅可以设置在某一行,也可以针对整个工程进行设置.典型的,假设你知道程序会在某个地方抛出NullPointerException,可是并不是每一次运行都会出现,就可以为工程设置异常断点,如下:
    project breakpoint
    程序会中断在出现抛出NullPointerException的地方.

本文中用到的代码见: github