对于使用Eclipse进行日常编程工作的工程师来说,调试是每天都在进行的工作。针对一般意义上的调试过程,相信每一位工程师朋友都熟练掌握了。这里介绍几个调试中比较实用的高级功能。
Eclipse远程调试Java自身支持调试功能,并提供了一个简单的调试工具--JDB,类似于功能强大的GDB,JDB也是一个字符界面的调试环境,并支持设置断点,支持线程线级的调试。
由于部署环境的差异性,相信很多朋友都碰到过开发环境正常测试过的功能在测试环境甚至生产环境下出现bug的情况。一般情况下,生产环境可以采取的手段比较单一,即通过日志的方式获取运行中的环境上下文,分析日志文件并尝试重现bug。这会带来的问题还是不少的,首先,日志的分析是一项比较耗时的工作;其次,现有的日志记录不一定能反映出问题,你可能需要多次重复这个过程(分析日志->猜测问题->加日志->部署->获取日志)来慢慢逼近问题。倘若是测试环境,我们还多了一项可供选择的手段——远程调试——将程序在测试环境中以debug模式启动,在本机使用Eclipse在工程中设置断点进行调试。
【具体步骤】
修改服务器启动参数
在服务器上的进程启动参数中添加:
-Xdebug -Xrunjdwp:transport=dt_socket,address=6666,server=y,suspend=n
连接到myhost:6666提供的调试服务。
-Xdebug通知JVM工作在DEBUG模式下,
-Xrunjdwp通知JVM使用(Java debug wire protocol)运行调试环境。该参数同时包含了一系列的调试选项:
transport指定了调试数据的传送方式;
dt_socket是指用SOCKET模式;
server=y/n VM 是否需要作为调试服务器执行;
suspend=y/n 是否在调试客户端建立连接之后启动 VM 。
设置完成后,启动服务端。
2. 启动本地代码
设置 Debug configurations-->Remote Java Application
注意在点击【Debug】按钮之前,一定不要多次“启动本地程序”,否则就会出现"Failed to connect to remote VM. Connection refused"异常,如下图所示:
3. 调试远程客户端
点击【Debug configurations】中的debug按钮,运行效果如下,接下来,就和本地调试一模一样了。在调试过程中,日志打印在远程服务器,本地console中看不到日志信息。调试的时候需要一个Http客户端发起请求,比如postman等等。
条件断点如果需要对循环中的数据进行调试,使用条件断点是个不错的选择。将断点设置在指定的位置上,右键进一步设置断点属性,如下:
调试时,程序会中断在符合条件的代码处。
异常断点断点不仅可以设置在某一行,也可以针对整个工程进行设置。假设你知道程序会在某个地方抛出NullPointerException,可是并不是每一次运行都会出现,就可以为工程设置异常断点,如下: