Idea 远程调试
本文主要介绍Idea远程调试java程序。
一、原理
远程调试的原理就是两个VM之间通过debug协议进行通信,两者之间通过socket进行通信。
二、实现
2.1 添加JVM参数
在启动JVM时加入参数
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
这是java 1.4 以后的参数,之前版本的参数不一样,由于java1.4之前的版本不常见了,这里就不做介绍了。
各参数含义如下:
- transport :调试程序和VM之间的通信方式, dt_socket 表示用套接字传输
- server=y : 表示是监听其他debugclient端的请求
- suspend : 表示是否在调试客户端建立连接之后启动 VM。
+ 如果为y,那么当前的VM就是suspend直到有debug client连接进来才开始执行程序
+ 如果为n,那么当前的VM就会直接执行,不会等待debug client连接进来
- address=5005 : 表示端口是5005
实例:
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=9999 -jar helloworld.jar
2.2 用Idea调试
在Idea中,选择Run -> edit Configurations -> “+” -> remote ,配置以下选项:
- Name : 可以随意设置,作为一个标识就好
- Host : 远程机器的host
- Port : 远程JVM启动时指定的address的值,即调试服务器的监听端口
2.3 开始调试
2.3.1 先运行java程序
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=9999 -jar helloworld.jar
2.3.2 启动Idea调试
点击Run -> Debug’{YOUR_DEBUG_NAME}’
- YOUR_DEBUG_NAME 就是2.2中指定的Name
三、注意事项
- 如果suspend选项选择的是n,而程序不是长期执行,或者短时间内就会经过所有断点。这会出现问题:Idea还没开始监听,程序就运行完了,达不到调试的目的。这种情况下应该选择suspend=y
- 如果是一个长时间运行的程序,比如tomcat中长期监听的JVM进程,可以选择suspend=n,这样在调试程序启动之前,JVM程序能完成一些初始化等工作。