在工作中经常会因为测试环境代码不及预期或者产生bug需要查看哪个步骤出现了问题,这个时候IDEA 远程debug就派上用场了。只要本地有运行的源代码就可以进行调试。
查看调试端口
- 登陆远程服务器。
- 执行shell命令
ps -ef|grep java|grep address
,查看对应的debug端口号。 - 如果已存在则可以直接在IDEA中设置远程调试。
- 不存在可以在Java程序启动时 加上 调试参数,如下:
java -server -Xms512m -Xmx512m -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5555 -Djava.ext.dirs=. ${main_class}
其中 address
为调试端口号。
如何启动调试
- 添加
Remote
配置:选择对于源码项目,填写需要debug的IP
和address
,如图:
- 点击启动调试
调试参数设置
右键断点可以看到Suspend
和Condition
两个关键字:
Suspend
-不阻塞其他线程
Suspend是断点暂停的生效范围。
Suspend:未勾选,程序运行到断点处并不会阻塞,而会继续执行后面的逻辑。
Suspend:勾选(是默认值),代表程序运行到断点处会阻塞。
- All(默认值):代表断点会阻塞所有线程。所以才会出现
Stop The World
的可怕情况。 - Thread:勾选,代表断点只会阻塞当前线程。避免远程debug时多人同时访问应用导致的冲突问题。因此,在多线程调试时,若你希望不阻塞程序,最好选择 Thread 当前线程阻塞策略,这样就不会影响到其他线程的工作。
- All(默认值):代表断点会阻塞所有线程。所以才会出现
Condition
-不阻塞其他请求
通过设置上面的 Suspend
参数为 Thread
可以不停止整个程序(Stop The World
),但是被调试代码存在被其他人调用的情况,这样就会干扰我们的调试,有没有更加细粒度的调试?
有,答案就是 condition
,如上图,通过 设置 content="1"
这样只有满足条件的请求会被断点。
EVAL-查看&修改值
- 当我们在调试的时候,如果查看某一个值,可以通过计算表达式,按快捷键
ALT + F8
就可以打开Evaluate Expression
,如图:
- 修改一个值,同样可以通过
EVAL表达式
,如图:
参考文档: