【日常开发】远程调试
前言
日常搬砖,日常踩坑,越来越对自己的开发技巧产生质疑,唯有慢慢积累才成。
远程调试简介
从事后端开发以来,与客户端开发很大的不同,就是要定位服务器上代码的漏洞。
1、对异常处理、日志收集要求高了。 2、服务器上分析问题的情况多了,不是用手机操作定位问题了。
- 定位服务器上的代码漏洞,光靠看异常信息与业务日志,还是有一定限制的,我们希望看到动态信息(例如,我们想看实际运行时加载的类是哪个类?)。
- 当然,我们也可以在服务器上使用
Java
调试工具,但是往往生产环境的限制条件较多(为了安全性或其他特性),不是所有的调试工具都可用。
这就需要一些方式,远程调试甚至断点调试服务器上的代码,这篇文章会介绍如何进行远程调试并结合IDEA开发工具实现断点调试。
相关须知
- 远程调试需要在服务器上进行一些预先配置,不是说可以直接在服务器上调试代码。
- 调试模式会影响性能,甚至安全性也会受影响,不能一直开启调试模式。
- JVM性能会受到影响,因为调试模式会屏蔽JVM本身的优化操作。
- 建议在内网,测试环境进行,不建议暴露在外网,会有潜在安全威胁。
开启Java远程调试模式
- JPDA(Java Platform Debugging Architecture)提供了一系列的API,作为JDWP(Java Debug Wire Protocol)调试协议的一部分。
- JDWP是一种应用进程与调试进程通信的协议,用于远程调试Java应用。
开启调试模式
- 在JVM运行参数加上如下命令,可以看到使用了2个JVM选项,
-Xdebug
与-Xrunjdwp
,-Xdebug
开启调试功能,-Xrunjdwp
配置JDWP协议,并有一些必要参数。
-Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=y
- JDWP协议参数
dt_socket
:配置套接字通信端口。dt_shmem
:应用进程与调试进程使用共享内存进行交互,因此,调试器与应用必须在一台机器上,因此远程调试不需要此选项。
- 其他参数
suspend
:该参数用于指定是否在调试进程attach到应用进程前,挂起应用进程,默认为y。如果,想要调试应用初始化的逻辑,需要开启这个选项。
实战演练
测试环境
- 一台服务器上面跑着Java应用,使用脚本启动。
- IDEA 2019.01.02
操作步骤
- 首先,看下JVM参数信息
ps -ef | grep java

- 在启动脚本,添加调试选项,并重启Java应用。

IDEA远程调试配置步骤
- Edit Configurations...
- 选择Remote,填入相应的IP地址以及端口。

- 点击debug,开始调试!!!。
结语
本文介绍了远程调试的基本概念,以及如何结合IDE来完成远程调试。Tomcat也有JDWP协议可以远程调试代码,虽然还没试过。
参考文献
转载自:https://juejin.cn/post/6844903907148185614