背景
我们日常工作中,难免会遇到这样场景的问题,明明在本地测试没有任何问题,为什么一到测试环境、开发环境就抛异常了呢?这到底是道德的沦丧?还是人性的扭曲?
那么此时此刻,如果产生该业务BUG的流程过于冗长,在本地复现时间复杂度高,且复现环境使用的数据差距较大,开发只能追着各个服务的日志文件一一查看,根据日志翻阅一行行的代码去猜测参数变更,猜测数据走向。过程无疑是极其缓慢的,那么有没有更简单、更方便、更舒适、更快乐、更容易让自己多摸鱼一会儿的方法呢?答案无疑是有的。那么开始吧

简述
本地DEBUG调试是IDEA自带的功能,无需任何插件与工具。非常方便,但是有个硬性要求,需要开放该服务器的端口,这样才能在本地进行监听断点调试。
当你还在一行一行查看各个服务的日志时候,你的同事已经打上断点进行DEBUG分析了。这就好比,你还在拿镰刀收割麦子,别人已经上大型收割机了。顿时就感觉凉了呀!

实战
实战代码仓库地址:https://gitee.com/yiang-hz/blog.git 目标项目:blog -> tips -> remote-debug
PS:直接拉取项目可以直接跳过该小节,前往调试小节
步骤1:创建项目
首先我们创建任意一个Maven项目,在pom文件添加Maven依赖与打包插件
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.2</version>
<relativePath/>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
步骤2:创建接口与启动类
DemoController与RemoteDebugApp
@RestController
public class DemoController {
@GetMapping("/debug/{id}")
public String testDebug(@PathVariable("id") String id) {
//请求示例:http://127.0.0.1:8168/debug/1
System.out.println("Request Param: id = " + id);
return "success: id = " + id;
}
}
@SpringBootApplication
public class RemoteDebugApp {
public static void main(String[] args) {
SpringApplication.run(RemoteDebugApp.class, args);
}
}
步骤3:配置端口,可不配置则使用默认端口
创建application.yml文件,配置
server:
port: 8168
调试
配置好项目或者拉取了代码之后,我们开始调试吧!

步骤1:测试打包
首先我们本地启动项目,运行访问 http://127.0.0.1:8168/debug/1 即可看到返回

IDEA启动可访问之后, 我们再打包Maven工具侧边栏可在IDEA最右侧找到。

日志栏查看打包路径,即可找到对应Jar

步骤2:配置Remote
1.选择Edit Configurations...

2.点击“+”找到Remote单击添加

3.配置并保存,备注:如果需要变更启动名称:在下图Name:一栏可以修改
以上即配置好了,我们在本地启动项目,并且复制上方 Command line ...JVM 一栏的配置
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
具体参数详解:
-Xdebug 使JVM以DEBUG模式运行。
-Xrunjdwp 使JVM使用(Java debug wire protocol)运行调试环境,该参数包含一系列的调试选项。
transport 指定了调试数据的传送方式,dt_socket是指用SOCKET模式,另有dt_shmem指用共享内存方式,其中,dt_shmem只适用于Windows平台。
address 调试服务器暴露出给客户端连接的端口号,可任意设置。非启动端口。
server=y/n JVM 是否需要作为调试服务器执行。
suspend=y/n 是否在调试客户端建立连接之后启动 JVM。
步骤3:本地启动Jar,带上启动监控参数
切到jar存在的目录,输入命令运行,如果在IDEA启动了则需要关闭,避免启动端口冲突
java -jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 remote-debug-1.0.jar
cmd启动该jar,可以看到监听端口为5005

步骤4:启动IDEA中配置好的Remote,可以看到链接信息

步骤5:断点调试
可以看到再次访问 http://127.0.0.1:8168/debug/1 之后,能够直接通过IDEA断点调试本地java-jar启动的项目了

如上,服务器同理。
总结
以上即是远程调试的方式,实现比较简单,这里描述的较为基础详细,希望有帮到大家。
同理,如果部分公司不允许远程调试操作,我们可以使用阿里巴巴开源项目监控工具Arthas去进行分析。不过入门、使用起来较为复杂。


1万+

被折叠的 条评论
为什么被折叠?



