idea remote debug 有两种debugger mode, 分别是attach to remote jvm和listen to remote jvm, 两种模式对于jvm的启动参数也不一样。
远程debug参数说明
序号 | 参数 | 必须(y/n) | 可选值 | 说明 |
---|---|---|---|---|
1 | -Xdebug | y | jvm在调试模式下启动 | |
2 | -Xnoagent | n | 禁用默认sun.tools.debug调试器 | |
3 | -Djava.compiler | n | NONE | 因为是调试场景,故而不需要编译耗时比较久的JIT,此参数用来禁用JIT编译,只使用解释器转译 |
4 | -Xrunjdwp | y | 使用jdwp进行通讯 | |
5 | transport | y | dt_socket dt_shmem | dt_socket基于套接字传输,dt_shmem基于共享内存 |
6 | server | n | y/n | jvm是否以server模式运行 |
7 | address | y | 5005 *:5005 | 服务器暴露的端口号,客户端可通过此端口连接;jdk9及以上的版本需设置ip:port |
8 | suspend | n | y/n | 服务端jvm是否在客户端启动之后启动 |
9 | onthrow | n | 产生指定类型的异常时jvm会被中断并进行调试 | |
10 | launch | n | 当jvm被中断时执行的可执行程序 |
Attach to remote JVM
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=31000 -jar xx.jar
如果要等待debug客户端连接上才启动的话(调试启动时的场景),可以将suspend设置为y,如下:
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=31000 -jar xx.jar
在idea 中创建一个Remote JVM Debug Configuration
Listen to remote JVM
当采用Listen to remote JVM模式时,只要将server=y这个参数去掉,其它不变即可。
java -agentlib:jdwp=transport=dt_socket,suspend=n,address=5005 -jar xx.jar
在idea 中创建一个Remote JVM Debug Configuration
docker container remote debugging
生成image时,Dockerfile内容如下:
FROM openjdk:11-jdk
ADD ./target/xxx.jar xxx.jar
CMD java -jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005 xxx.jar
运行docker时需要添加-p参数
docker run -p 5005:5005 {imageId}
后面idea中运行remote debug就可以了。
kubernetes pod remote debugging
pod 端口映射
在pod运行起来后,将pod的端口映射出来,可以通过下面的命令实现:
kubectl port-forward {podName} 5005:5005 -n {namespace}
Service 端口映射
也可以在k8s中将service的端口以NodePort方式映射出来,例如:
apiVersion: v1
kind: Service
metadata:
name: appservice
spec:
type: NodePort
selector:
app: app
ports:
- name: debug-agent
protocol: TCP
port: 5005
nodePort: 30055
targetPort: 5005
但是以这种方式进行调试,在pod还没有完全启动起来之前,映射出来的jdwp端口并不能访问。pod起来之后,就可以了。
参考
idea基于jdwp远程debug参数设置
Enable remote debugging Spring Boot apps on Kubernetes
Java Remote Debug for Applications Running in Kubernetes
Debug a Java application using a Dockerfile
debug-jvm-in-docker.md