java 远程调试使用方法(springboot 启动执行的原理)

1. JPDA 概念说明

       JPDA(Java Platform Debugger Architecture) 是 Java 平台调试体系结构的缩写,通过 JPDA 提供的 API,开发人员可以方便灵活的搭建 Java 调试应用程序。
JPDA 主要由三个部分组成:Java 虚拟机工具接口(JVMTI),Java 调试线协议(JDWP),以及 Java 调试接口(JDI)。

JDWP是 Java Debug Wire Protocol 的缩写,它定义了调试器(debugger)和被调试的 Java 虚拟机(target vm)之间的通信协议

2. 使用说明

  1. springboot在IDEA 和使用java -jar 命令启动 类加载器是不一样的, 在IDEA 上的类加载器是AppClassloader, 而使用java -jar 命令 类加载器是LaunchedURLClassLoader(springboot 自定义的类加载器)

 2. 那么如何才能在debug模式下找到这个类加载器呢, 首先将demo-0.0.1-SNAPSHOT.jar 进行解压,解压之后得到的目录接口如下:

进入META-INF目录下查看MANIFEST.MF

图上所示就是springboot启动时执行的main方法入口,这个包在BOOT-INF/lib 中并没有被依赖进来,而是将这个类所在的类的class文件拷贝放入到根目录下(这么做符合jar包的启动规范,系统类加载器可以加载到启动类)

3, 找到该类之后再原项目中依赖这个包,然后重新打包项目

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-loader</artifactId>
</dependency>

4. 重新打包后使用如下命令启动项目

java -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5050 -jar demo-0.0.1-SNAPSHOT.jar

命令说明:

-agentlib: java的代理命令

使用java 命令 可以进行查看

按照提示输入: java -agentlib:jdwp=help

suspend 启动时是否等待

transport 连接方式(dt_socket, dt_shmem)

address 地址

server 监听debug模式

5. 配置idea 

mydebut 可以不写, 选择Attache to remote JVM (追加到远程的jvm 上), 端口需要和使用java -jar 启动时的端口保持一致

6. 设置断点,点击debug 启动idea

7. 此时远程调试的配置已经完成,现在解释为什么类加载器不一样,同步debug 可以看到在springboot java -jar启动时,通过设置当前线程的为springboot自定义的类加载器

以上就是springboot启动原理

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值