【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'

四、最后说一句

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

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

相关文章
|
6月前
|
安全 前端开发 Java
JDK源码级别彻底剖析JVM类加载机制
JDK源码级别彻底剖析JVM类加载机制
|
缓存 Java Shell
【alibaba/jvm-sandbox#06】事件监听的关键设计
介绍jvm-sandbox中事件机制的设计,通过用事件Id与事件之间的映射关系进行解耦,通过Spy类的静态方法携带事件Id进行核心事件逻辑的埋点注入
503 0
|
3月前
|
监控 JavaScript Java
JVM源码级别分析G1发生FullGC元凶的是什么
线上系统遭遇频繁Old GC问题,监控显示出现多次“to-space exhausted”日志,这表明垃圾回收过程中因年轻代 Survivor 区或老年代空间不足导致对象晋升失败。通过 JVM 源码分析,此问题源于对象转移至老年代失败时,JVM 无法找到足够的空间存放存活对象。进一步排查发现大对象分配占用了预留空间,加剧了空间不足的情况。使用 JFR 分析工具定位到定期报表序列化导致大量大对象生成,通过改用堆外内存进行序列化输出,最终解决了频繁 Old GC 问题。
117 0
|
Java jvm-sandbox 容器
【alibaba/jvm-sandbox#05】沙箱事件详解
alibaba/jvm-sandbox设计了完善且复杂的沙箱事件,用于实现事件探测和流程控制机制。但不建议对于同一个类、同一个方法多次增强
556 0
|
6月前
|
Arthas 缓存 Java
[Jvm]程序员的精进之路~JDK代理源码初探
[Jvm]程序员的精进之路~JDK代理源码初探
阿里Java高级岗中间件二面:GC+IO+JVM+多线程+Redis+数据库+源码
虽然“钱多、事少、离家近”的工作可能离技术人比较远,但是找到一份合适的工作,其实并不像想象中那么难。但是,有些技术人确实是认真努力工作,但在面试时表现出的能力水平却不足以通过面试,或拿到高薪,其实不外乎以下 2 个原因:
花20天刷完Alibaba JVM笔记去面阿里,却意外拿到京东Offer?
Java虚拟机(Java Virtual Machine 简称JVM)是运行所有Java程序的抽象计算机,是Java语言的运行环境,它是Java 最具吸引力的特性之一。
|
消息中间件 NoSQL Dubbo
阿里Java高级岗中间件二面:GC+IO+JVM+多线程+Redis+数据库+源码
一转眼,都2023年了,你是否在满意的公司?拿着理想的薪水? 虽然“钱多、事少、离家近”的工作可能离技术人比较远,但是找到一份合适的工作,其实并不像想象中那么难。但是,有些技术人确实是认真努力工作,但在面试时表现出的能力水平却不足以通过面试,或拿到高薪,其实不外乎以下 2 个原因: 第一,“知其然不知其所以然”。做了多年技术,开发了很多业务应用,但似乎并未思考过种种技术选择背后的逻辑。所以,他无法向面试官展现出自己未来技术能力的成长潜力。面试官也不会放心把具有一定深度的任务交给他。 第二,知识碎片化,不成系统。在面试中,面试者似乎无法完整、清晰地描述自己所开发的系统,或者使用的相关技术。
|
Java C++
JVM - 一个案例反推不同JDK版本的intern机制以及intern C++源码解析
JVM - 一个案例反推不同JDK版本的intern机制以及intern C++源码解析
97 0
|
前端开发 安全 Java
JVM-白话聊一聊JVM类加载和双亲委派机制源码解析
JVM-白话聊一聊JVM类加载和双亲委派机制源码解析
75 0