一、介绍:
Java远程调试的原理是两个JVM之间通过debug协议进行通信,然后以达到远程调试的目的。两者之间可以通过socket进行通信。
二、步骤:
1、修改配置文件,添加jvm 启动参数 -Xrunjdwp 开启远程debug 端口。一般设置为8888 ,注意staging环境部署了多个项目,端口可能冲突。
参数: "-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8888"
2、线下发布成功后,可以查看进程判断是否开启了远程debug端口
#ps -ef | grep java
3、接下来在IDE中配置项目的远程debug即可。idea中可以这样配置
菜单栏 run\edit configurations,左上角+ 添加一个remote
remote配置中设置host 为staging环境 host:目标服务器 ip port:8888 应用即可~
接下来在工具栏里选择刚添加的remote ,点debug即可像在本地debug一样debug staging环境的代码了~
三、注意:
远程debug确实好用,但不要上瘾~毕竟在debug的时候,别人就没法正常使用staging环境了。所以除非万不得已,不要在staging环境debug。
这个改法应该也适用于线上环境,但是线上环境更加谨慎。千万不要这样乱搞~
(工程里可以设置jvm启动参数,不是一个很安全的方法。一般都应该是运维在服务器上去设置的)
----------------------分割线以下是特殊场景---------------------
由于涉及到公司服务器配置,没有截图,有些步骤也没写的特别清楚,搞不定的可以留言我。
1.修改host
在noah环境中找到测试环境hosts配置,粘贴到本地hosts(beta,dev也可以,当然线上也可以)
2.登录服务器
登录服务器
ifconfig查看服务器ip
3.idea配置远程debug
在idea中点击下面按钮开启Run/Debug Configurations界面
点击"+"添加Remote类型配置得到下图.configuration中配置Host和Port,Host填服务器ip,Port填服务器端口,比如50001(这种remote模式不能调试jsp文件,因此想调试jsp文件,请用tomcat server remote模式)
Note: Host服务器IP可以在跳板机连接后,输入ifconfig进行查看。
4.登录服务器
在工程文件夹中,找到tomcat的启动脚本修改里面tomcat的启动参数,添加上图中参数设置示例到export JAVA_OPTS="..."里,下面两个参数任意一个都可以。
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=127.0.0.1:<port>
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=127.0.0.1:<port>
上面的address中<port>是java debug的服务端口,自己定义,注意不要和其他端口冲突,
比如 -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=127.0.0.1:5005
5.重启tomcat服务
sudo /home/q/tools/bin/restart_tomcat.sh /home/q/www/ttsui/
( 红字替换成自己的工程文件名)(且慢,这里是不用替换自己的文件名,直接是原来工程名即可)
6.socat端口映射
我使用的服务器的ip地址为11.11.11.11, 本机的ip地址为1.1.1.1,因为服务器java debug服务端口是5005端口,而idea中设置的java debug监听端口是50001端口,此时我想用本机连接服务器进行远程调试,需使用socat进行端口映射:
socat TCP4-LISTEN:50001,fork,range=1.1.1.1/32 TCP4:127.0.0.1:5005
上面命令有一个很重要的注意点:range后面的ip之后的24代表这个ip的100.81.128必须与本地相同,如果是32,则表示整个ip都与本地相同,这个意思就是这个ip地址的人在socat转发的端口上可调试
调试之后,记得关闭这个进程,否则
7.开始debug
点击本地工程debug按钮,出现如下提示即为远程连接成功,在相应位置添加断点,向服务器发送请求,开始调试
8.发送测试请求