【alibaba/jvm-sandbox#01】debug源码的技巧

1,341 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第 35 天,点击查看活动详情

我是石页兄,朋友不因远而疏,高山不隔友谊情;偶遇美羊羊,我们互相鼓励

欢迎关注微信公众号「架构染色」交流和学习

image.png

一、alibaba/jvm-sandbox 概述

alibaba/jvm-sandbox 是 JVM 沙箱容器,一种 JVM 的非侵入式运行期 AOP 解决方案。沙箱容器提供

  1. 动态增强类你所指定的类,获取你想要的参数和行信息甚至改变方法执行
  2. 动态可插拔容器框架

在其能力至上构建的上层应用有:

二、简述

2.1 系统环境

mac 系统 (windows 下还没弄清楚)

1)前置条件 :

  1. 自定义模块的 jar 包拷贝到 sandbox 运行时的自定义模块的目录下
  2. 自定义模块的源码作为一个模块,附加在 sandbox 的源码项目中

2)debug 模块和 sandbox 源码的步骤 :

  1. 开启远程调试模式 来 启动目标应用
  2. idea 中使用 sandbox 源码进行远程调试
  3. 在命令行执行 让 sandbox 挂载目标应用,并执行模块的功能.

三、源码调试

3.1、准备工作

1)把自定义模块,拷贝到 sandbox 的自定义模块的目录下 从官网上了解下sandbox 的目录结构.

cp /Users/kris/GitProject/jvm-sandbox/clock-tinker/target/clock-tinker-1.2.2-jar-with-dependencies.jar ~/.sandbox-module/

2)自定义模块的源码作为一个模块,附加在 sandbox 的源码项目中 如果没有自定义模块就使用源码中的sandbox-debug-module模块 我的 demo 测试中,目标应用和自定义的模块都放到了 sandbox 的源码项目中.

image.png

3.2 开启远程调试

1)开启远程调试模式 来 启动目标应用

JDWP 远程调试技术 了解一下->JDWP 协议及实现

//cd 到可执行jar包的目录
cd /Users/kris/GitProject/jvm-sandbox/sandbox-demo/artifacts
// 启动jar 并开启jdwp监听.
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5050 -jar sandbox-demo.jar
//开启了监听,等待远程调试的链接.
Listening for transport dt_socket at address: 5050

2)idea 中使用 sandbox 源码进行远程调试

image.png

如果目标进程的控制台出现 ***.jar中没有主清单属性的; 百度了解下 idea 打可执行的 Jar 包

3)在命令行执行 让 sandbox 挂载目标应用,并执行模块的功能

  1. 查看进程 id
jps -l
44178 org.jetbrains.idea.maven.server.RemoteMavenServer36
44164
55401 sun.tools.jps.Jps
55214 sandbox-demo.jar
  1. 挂载并使用模块的功能
//cd 到sandbox 的安装目录
cd ~/.opt/sandbox/bin/

//pid 修改为 真实的目标进程id
./sandbox.sh -p 55214 -d 'broken-clock-tinker/repairCheckState'

./sandbox.sh -p pid -d 'broken-clock-modifier/modifyReportResultTo2'

四、最后说一句

我是石页兄,如果这篇文章对您有帮助,或者有所启发的话,欢迎关注笔者的微信公众号【 架构染色 】进行交流和学习。您的支持是我坚持写作最大的动力。

欢迎点击链接扫马儿关注、交流。