1、我用JDK是1.8 hotspots,java调试的原理是:将JVM看做一个服务器,客户端连接JVM,控制程序的执行,编译java程序时,不需要指定特殊编译选项。
2、启动java虚拟机时,命令行设置为调试模式:
# 适合1.4或更早版本,我的jdk1.8服务端用这种方式启动,IDEA设置的断点无法停住,所以建议用第二种方法(或用配置IDEA时提示的方法):
java -Xdebug -Xrunjdwp:transport=dt_socket,address=5005,server=y,suspend=n mytest
或
# 适合1.5或以后
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 mytest
# 不确定就两种方法都试试
# mytest是编译好的java程序 mytest.class
/*
* [postgres@qinhvm exp_java]$ cat mytest.java
* # 编译
* javac mytest.java
*/
import java.io.*;
import java.util.Scanner;
class mytest {
public static void main(String[] args) {
// Declare the variables
int num;
// Input the integer
while(true) {
System.out.println("Enter the integer: ");
// Create Scanner object
Scanner s = new Scanner(System.in);
// Read the next integer from the screen
num = s.nextInt();
num = incr1(num);
// Display the integer
System.out.println("Entered integer is: " + num);
}
}
static int incr1(int n) {
n++;
return n;
}
}
3、客户端调试工具连接服务端(jdb,IDEA等)
# 在本机和远程都可以用这个命令
jdb -connect com.sun.jdi.SocketAttach:hostname=192.168.139.153,port=5005 -sourcepath /home/postgres/exp_java
或者
# 在本机试过可以,远程不行
jdb -attach 192.168.139.153:5005 -sourcepath ~/exp_java
4、然后操作类似gdb,设置断点,stop in <函数名>,stop at <java文件:行号>,next,print,threads(查看线程)等,不过最好使用支持java远程调试的IDE工具,例如,IntelliJ IDEA ,如前所述,一般都可以设置远程JVM调试,点击调试按钮连接服务端,然后直接在代码中设置断点,比jdb方便多了。
5、IntelliJ IDEA 配置远程调试java程序
如果服务端、客户端配置正确,就会有下面打印
然后在源码中设置断点,再运行服务端 java程序,是代码执行到断点。
参考:
A Practical Guide to Java Remote Debugging in the Real World (stackify.com)