前言
线上服务器出现的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操作几乎一样)
连接成功以后,目标程序就会继续启动,然后你就可以在IDE上面给远程的程序打断点了。