使用JDWP远程调试java程序

2019-04-25  本文已影响0人  方雲

前言

线上服务器出现的bug,因为各种复杂环境的原因,经常会很难在本地调试,只能到处打log减少重启次数。一直有听说有远程调试这玩意,因为使用场景不多+懒惰一直没去调研,最近终于在一门课程上面揭开了远程调用的面纱,记录一下。

简介

JDWP(Java Debug Wire Protocol)我倾向于翻译为java调试传输协议,即调试器与目标java程序之间的传输协议。JVM自带有对这个协议相应的支持,通过下面的命令可以查看help文档。

/Users/user$  java -agentlib:jdwp=help
               Java Debugger JDWP Agent Library
               --------------------------------

  (see http://java.sun.com/products/jpda for more information)

jdwp usage: java -agentlib:jdwp=[help]|[<option>=<value>, ...]

Option Name and Value            Description                       Default
---------------------            -----------                       -------
suspend=y|n                      wait on startup?                  y
transport=<name>                 transport spec                    none
address=<listen/attach address>  transport spec                    ""
server=y|n                       listen for debugger?              n
launch=<command line>            run debugger on event             none
onthrow=<exception name>         debug on throw                    none
onuncaught=y|n                   debug on any uncaught?            n
timeout=<timeout value>          for listen/attach in milliseconds n
mutf8=y|n                        output modified utf-8             n
quiet=y|n                        control over terminal messages    n

Obsolete Options
----------------
strict=y|n
stdalloc=y|n

Examples
--------
  - Using sockets connect to a debugger at a specific address:
    java -agentlib:jdwp=transport=dt_socket,address=localhost:8000 ...
  - Using sockets listen for a debugger to attach:
    java -agentlib:jdwp=transport=dt_socket,server=y,suspend=y ...

Notes
-----
  - A timeout value of 0 (the default) is no timeout.

Warnings
--------
  - The older -Xrunjdwp interface can still be used, but will be removed in
    a future release, for example:
        java -Xdebug -Xrunjdwp:[help]|[<option>=<value>, ...]

接下来讲下具体怎么使用。

目标java程序开启jdwp的监听

增加jvm参数,然后重启java进程

-agentlib:jdwp=transport=dt_socket,server=y,address=8000

即使用socket模式在8000端口监听等待jdwp的客户端,这个客户端就是后文的调试器。
重启之后程序会卡在那里等待有调试器连接之后才会继续启动程序。

  • PS:jvm参数在spring boot项目和tomcat项目怎么加自行google,此处不累赘。
  • PPS:服务器端口开放就不用说了,确定能telnet通再继续下一步吧。

使用IDEA作为调试器(eclipse操作几乎一样)

点击运行设置下拉选项
点击Edit Configurations...
弹出窗口中点击左上角的+号,然后选择Remote
设置调试器连接目标程序
保存设置之后,点击Debug

连接成功以后,目标程序就会继续启动,然后你就可以在IDE上面给远程的程序打断点了。

上一篇下一篇

猜你喜欢

热点阅读