由于部署环境的差异性,相信很多朋友都碰到过开发环境正常测试过的功能在测试环境甚至生产环境下出现bug的情况。一般情况下,生产环境可以采取的手段比较单一,即通过日志的方式获取运行中的环境上下文,分析日志文件并尝试重现bug。这会带来的问题还是不少的,首先,日志的分析是一项比较耗时的工作;其次,现有的日志记录不一定能反映出问题,你可能需要多次重复这个过程(分析日志->猜测问题->加日志->部署->获取日志)来慢慢逼近问题。倘若是测试环境,我们还多了一项可供选择的手段——远程调试——将程序在测试环境中以debug模式启动,在本机使用IDEA在工程中设置断点进行调试。
1、添加pom文件
在项目pom.xml里配置jvmArguments参数(-Xdebug -Xrunjdwp:transport=dt_socket,address=5005,server=y,suspend=n)
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<jvmArguments>-Xdebug -Xrunjdwp:transport=dt_socket,address=5005,server=y,suspend=n</jvmArguments>
</configuration>
</plugin>
</plugins>
</build>
具体参数详解:
-Xdebug 通知JVM工作在DEBUG模式下;
-Xrunjdwp 通知JVM使用(Java debug wire protocol)运行调试环境。该参数同时包含了一系列的调试选项;
transport 指定了调试数据的传送方式,dt_socket是指用SOCKET模式,另有dt_shmem指用共享内存方式,其中,dt_shmem只适用于Windows平台;
address 调试服务器的端口号,客户端用来连接服务器的端口号;
server=y/n VM 是否需要作为调试服务器执行;
suspend=y/n 是否在调试客户端建立连接之后启动 VM;
2、项目打包
3、项目启动
(1)Jar方式启动
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar test_debug_v1.0.jar
(2)Tomcat(war包)启动
Tomcat(war包)运行的项目需要修改Tomcat启动脚本,Linux 的是 catalina.sh,Windows 的是 catalina.bat,将这个命令添加进去:
JAVA_OPTS="$JAVA_OPTS -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005"
4、Idea配置远程Debug
(1)点击启动项下拉,选择Edit Configurations...
(2)点击左上角+,选择"Remote",添加配置
(3)编辑配置项:Host 和 Port(需要与pom文件和远程启动包Jar/War的配置一致)
(4)选中刚刚添加的配置,点击启动即可