JVM远程DEBUG

本文转自公司同事内训分享。

原理

  1. JPDA简介 

    JPDA(Java Platform Debugger Architecture)为Java平台上的调试器定义了一个标准的体系结构。该体系结构包括3个主要组成部分:JVM TI、JDI和JDWP。


    JVM TI的全称是Java Virtual Machine Tool Interface,它定义了JVM为了支持调试而必须提供的功能及相应的访问接口。这些访问接口是以本地语言的形式提供的,由JVM(比如Sun公司的HotSpot VM)负责实现。


    JDI的全称是Java Debug Interface,它定义了访问JVM TI接口的高层API,以纯Java语言提供,由JDK实现(在Sun JDK的tools.jar可以找到)。调试器直接使用JDI来实现调试的功能。与JPDA back-end相对应,JDI实现的角色就是JPDA front-end。


    JDWP的全称是Java Debug Wire Protocol,它定义了JPDA front-end和JPDA back-end之间通讯信息的二进制格式。这里的通讯信息主要包括两种:调试器发送给JVM的请求信息和JVM发送给调试器的调试信息。


    总结一下,调试器调用JDK提供的JDI实现 (JPDA front-end),经由JDWP协议 ,和JVM自带的JPDA back-end(jdwp.dll, jdwp.so, ...)进行通讯。JPDA back-end 通过调用JVM TI接口 ,从而获知调试信息,或发送控制命令。然后,JPDA back-end 将调试信息或命令执行结果,通过JDWP协议 ,返回给调试器 。

  2. 如何启用JPDA 

    默认情况下,JVM并没有启用JPDA back-end。需要在启动JVM的命令行加载以下参数:

    -Xdebug  -Xrunjdwp:transport=dt_socket, address=8000,server=y,suspend=y

     

    -Xdebug

    启用调试特性。

    -Xrunjdwp

    启用JDWP实现,它包含若干子选项。

    transport=dt_socket

    JPDA front-end和back-end之间的传输方法。dt_socket表示使用套接字传输。

    address=8000

    JVM在8000端口上监听请求。

    server=y

    y表示启动的JVM是被调试者。如果为n,则表示启动的JVM是调试器。

    suspend=y

    y表示启动的JVM会暂停等待,直到调试器连接上。

步骤

  1. 登录到测试机并切换到应用BIN目录
  2. sudo ./start.sh debug 以调试模式启动应用
  3. 用IDEA导入开发代码
  4. 新建Remote调试配置
     
  5. 启动远程调试

注意事项:

请忽随意DEBUG测试环境中的公用服务,否则会导致调用方卡死乃至超时,影响测试。

建议在需要的时候,单独部署一个版本做调试用。

你可能感兴趣的:(测试工具)