JAVA远程调试在测试中的应用

阿凡达2018-07-04 13:18

前言

本地调试是开发常用的软件开发方法, 通过本地调试可以进行本地代码的检查和自测流程. 同本地代码调试方式类似的远程调试, 同样可以达到这种效果.

本文将介绍JAVA远程调试结合条件断点在测试中的应用.

如何在Windows中进行远程调试
1. 在服务器限制调试ip和端口
  • -Xrunjdwp:transport=dt_socket,address=127.0.0.1:30088,server=y,suspend=n;

参数说明:
-Xrunjdwp<sub-options> : 加载JVMJPDA参考实现库
transport=dt_socket Socket连接,可选dt_shmem 通过共享内存的方式连接到调试服务器
address=30088 :调试服务器监听的端口
server=y :是否是服务器端,n为客户端
suspend=n :启动过程是否加载暂停,y为启动时暂停,方便调试启动过程

  • 若使用omad自动部署平台的话, 只需要在实例>配置>应用配置>设置debug端口 (博主使用了此方法)
对于调试的原理这里使用了JDWP协议, 在文末有一个简单介绍.

2. 通过第三方软件配置端口转发(tunnel)
windows需要通过第三方工具如:xshell,putty登实现本地端口转发, 这里以xshell为例:
远程debug端口: 30088
本地设置的转发端口:31088
  • 本地windows通过vpn链接到服务器

  • 建立隧道
 
  •  确定隧道建立成功

3. Eclipse安装远程调试
  • 在“Debug”菜单选项下选择“Debug Configurations”
 
  • 选择“Remote Java Application”图标,右键选择“New”
  • 设置调试主机与端口
 注意:这里的远程主机不要配置具体的IP(因为我们的调试配置是127.0.0.1,这里如果指定了IP,会连接不上)。修改完成,需要重新连接一下shell,如果还是失败,需要重启一下终端。
  • 确定隧道已连接
 在debug模式出现了链接状态,点击可以断开.

远程调试与测试应用
准备就绪,可以通过远程的程序进行调试了. 以蜂巢的测试环境为例:
1.  在创建容器的代码中打一个断点
2. 触发容器创建流程

 3. 更改要注入的参数值

看到这里可能有人要提出疑问, 这种多人共用的测试环境, 这种调试方法会不会对其他人造成影响?
所以这里我们可以结合条件断点过滤用户,达到远程调试、独立测试的目的.

1. 断点处右键>BreakpointProperties
 2. 勾选Conditional>填写要筛选的条件
 现在就可以放心的进行远程调试了~

JDWP协议
这里对协议做简单说明, 便于大家理解调试的原理, 如果有感兴趣的同学可以深入研究一下.

JDWP 是 Java Debug Wire Protocol 的缩写,它定义了调试器(debugger)和被调试的 Java 虚拟机(target vm)之间的通信协议。

这里首先要说明一下 debugger 和 target vm。Target vm 中运行着我们希望要调试的程序,它与一般运行的 Java 虚拟机没有什么区别,只是在启动时加载了 Agent JDWP 从而具备了调试功能。而 debugger 就是我们熟知的调试器,它向运行中的 target vm 发送命令来获取 target vm 运行时的状态和控制 Java 程序的执行。Debugger 和 target vm 分别在各自的进程中运行,他们之间的通信协议就是 JDWP。

JDWP 大致分为两个阶段:握手和应答。
握手是在传输层连接建立完成后,做的第一件事:
  • Debugger 发送 14 bytes 的字符串“JDWP-Handshake”到 target Java 虚拟机
  • Target Java 虚拟机回复“JDWP-Handshake”

 


总结
通过这种方法, 我们可以模拟一些比较难构造的测试场景, 比如一些异常参数的传递.当然这只是一种辅助手段.
最后加一个小备注, 如果你遇到了下面这个error: 可以优先检查配置及远程端口连接是否开启;其次在eclipse的debug模式中查看是否已建立了连接, 如果已经建立了连接, 断开重连即可.

本文来自网易实践者社区,经作者张雨授权发布。