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

简介: alibaba/jvm-sandbox是 一种JVM的非侵入式运行期 AOP 解决方案。沙箱容器提供1. 动态增强类你所指定的类,获取你想要的参数和行信息甚至改变方法执行2. 动态可插拔容器框架
我是石页兄,朋友不因远而疏,高山不隔友谊情;偶遇美羊羊,我们互相鼓励

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

一、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'

四、最后说一句

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

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

相关文章
|
缓存 Java Shell
【alibaba/jvm-sandbox#06】事件监听的关键设计
介绍jvm-sandbox中事件机制的设计,通过用事件Id与事件之间的映射关系进行解耦,通过Spy类的静态方法携带事件Id进行核心事件逻辑的埋点注入
392 0
|
Java jvm-sandbox 容器
【alibaba/jvm-sandbox#05】沙箱事件详解
alibaba/jvm-sandbox设计了完善且复杂的沙箱事件,用于实现事件探测和流程控制机制。但不建议对于同一个类、同一个方法多次增强
413 0
|
10月前
|
运维 监控 安全
花20天刷完Alibaba JVM笔记去面阿里,却意外拿到京东Offer?
Java虚拟机(Java Virtual Machine 简称JVM)是运行所有Java程序的抽象计算机,是Java语言的运行环境,它是Java 最具吸引力的特性之一。
|
存储 安全 Java
【alibaba/jvm-sandbox#07】事件监听的关键实现
代码中的 new 一个 Listener,sandbox 内部就创建并注册一个与之对应的事件处理器。Spy 的静态方法中将方法事件交给了事件处理器经过一些内部处理,最终回调 listener 的方法。
361 0
|
Java jvm-sandbox 容器
【alibaba/jvm-sandbox#04】通过EventWatchBuilder修改字节码
jvm-sandbox给使用者提供EventWatchBuilder对代码插桩进行了封装;把底层复杂的字节码操控隐藏起来,让使用者仅关注操控什么类、什么方法、方法中的什么逻辑。
286 0
|
Java jvm-sandbox 开发者
【alibaba/jvm-sandbox#03】JavaAgent 修改字节码的机制
开发者一般采用建立一个 Agent 的方式来使用 JVMTI,使用 JVMTI 一个基本的方式就是设置回调函数,在回调函数体内,可以 获取各种各样的VM级信息,甚至控制VM行为,如类加载时修改类
276 0
|
Java jvm-sandbox 容器
【alibaba/jvm-sandbox#02】通过无侵入AOP实现行为注入和流控
任何一个 Java 方法的调用都可以分解为`BEFORE`、`RETURN`和`THROWS`三个环节,由此在三个环节上引申出对应环节的事件探测和流程控制机制。
253 0
|
8天前
|
存储 缓存 算法
深入浅出JVM(二)之运行时数据区和内存溢出异常
深入浅出JVM(二)之运行时数据区和内存溢出异常
|
8天前
|
Java Linux Arthas
linux上如何排查JVM内存过高?
linux上如何排查JVM内存过高?
807 0