我是石页兄,朋友不因远而疏,高山不隔友谊情;偶遇美羊羊,我们互相鼓励欢迎关注微信公众号「架构染色」交流和学习
一、alibaba/jvm-sandbox 概述
alibaba/jvm-sandbox 是 JVM 沙箱容器,一种 JVM 的非侵入式运行期 AOP 解决方案。沙箱容器提供
- 动态增强类你所指定的类,获取你想要的参数和行信息甚至改变方法执行
- 动态可插拔容器框架
在其能力至上构建的上层应用有:
-
- 其chaosblade-io/chaosblade-exec-jvm 是一个基于 jvm-sandbox 的 chaosblade 执行器,用于通过增强类在 Java 应用程序上进行混沌实验。
-
- 基于 JVM-Sandbox 的录制/回放通用解决方案
二、简述
2.1 系统环境
mac 系统 (windows 下还没弄清楚)
1)前置条件 :
- 自定义模块的 jar 包拷贝到 sandbox 运行时的自定义模块的目录下
- 自定义模块的源码作为一个模块,附加在 sandbox 的源码项目中
2)debug 模块和 sandbox 源码的步骤 :
- 开启远程调试模式 来 启动目标应用
- idea 中使用 sandbox 源码进行远程调试
- 在命令行执行 让 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 的源码项目中.
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 源码进行远程调试
如果目标进程的控制台出现 ***.jar中没有主清单属性
的; 百度了解下 idea 打可执行的 Jar 包
3)在命令行执行 让 sandbox 挂载目标应用,并执行模块的功能
- 查看进程 id
jps -l
44178 org.jetbrains.idea.maven.server.RemoteMavenServer36
44164
55401 sun.tools.jps.Jps
55214 sandbox-demo.jar
- 挂载并使用模块的功能
//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'
四、最后说一句
我是石页兄,如果这篇文章对您有帮助,或者有所启发的话,欢迎关注笔者的微信公众号【 架构染色 】进行交流和学习。您的支持是我坚持写作最大的动力。