有朋友面试时被问到,怎么远程调试部署在Linux中的系统?听到这个问题,那位朋友直接懵了,第一反应是震惊,已经部署在Linux中的系统还能调试? 沉默了几秒,只好说没有远程调试过Linux中的系统,一般线上问题都是看日志解决的,本地运行才通过调试解决。 那么,真的能在本地远程调试Linux系统吗?
接下来,介绍一下在IDEA中调试远程部署在Linux系统中的详细过程。
1、需求
项目已经部署到Linux服务器上,如何像在本地IDEA中运行时一样,可以进行断点联调呢?
2、解决方案
IDEA已经考虑了这种情况,自带远程调试功能。其它工具,像是Eclipse也一样可以。
大致步骤是,在服务启动时,开启远程调试的JVM参数,然后利用IDEA自带的远程调试工具,Remote JVM Debug 配置相应参数即可。
3、具体步骤
3.1 服务端
服务启动的时候,添加JVM支持远程调试的参数
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8081
- jdwp: Java Debug Wire Protocol(Java调试线协议)是Java平台提供的一种标准调试协议,它允许调试器与Java应用程序进行通信。
- transport=dt_socket: 指定传输层使用的通信方式。这里 dt_socket 表示使用TCP/IP套接字作为传输机制。这使得调试器能够通过网络连接到正在运行的Java进程。
- server=y 表示这个JVM实例将作为服务器端等待客户端(调试器)的连接。
- suspend=n 表示JVM启动时不暂停执行。如果设为 suspend=y,则JVM会在启动后暂停,等待调试器连接。
- address=5005 指定监听(调试)的端口号为8081。
3.2 IDEA配置
在IDEA中,打开远程服务运行的代码,不用启动项目,只要进行如下配置:
配置信息如下
点击OK,配置完成后,Debug启动remote,然后就可以开始调试了。
连接成功控制台会显示下面内容,虽然本地IDEA没有启动项目,但远程启动了项目,会自动与本地的代码进行匹配,达到与本地启动运行时一样的调试效果。
3.3 具体调试
和在本地IDEA运行服务一样调试,可以用Postman等测试工具访问对应接口,或者直接浏览器访问。访问后会进入到对应断点位置。
3.4 面试问题总结
如何远程调试的:服务器启动的时候设置JVM远程调试的参数(设置协议、调试端口)。
开发工具中添加对应的远程调试的配置启动项,设置调试的端口和服务器ip地址。
3.5 误区
一般公司或者企业的服务器是在内网环境下,很少有情况会关闭防火墙或者开放允许的调试端口的。所以,大部分情况下,远程调试都不被允许的。
这种情况下通常都是,看服务日志,定位具体问题,再解决问题。
如果可以远程调试,需要确保远程服务器的代码版本和IDEA中的代码版本是一致的,这样才能分析。不一致的话,可能会断点不准确。
通常情况,先git获取(check out) 发布到服务器的那个版本的代码,然后再进行远程调试。