JVM动态字节码注入工具-Byteman

news2024/9/22 23:24:21

Byteman是一个字节码操作工具,它使得在加载时或在应用程序运行时更改Java应用程序的操作变得简单。它无需重写或重新编译原始程序即可工作。实际上,Byteman甚至可以用来修改Java代码,这些代码构成了Java虚拟机的一部分,比如String、Thread等类。Byteman采用了一种基于Java的清晰、简单和易于使用的事件条件动作(ECA)规则语言。ECA规则用于指定应该在何处、何时以及如何转换原始Java代码以修改其操作。
Byteman的发明主要是为了使用一种称为错误注入的技术来支持多线程和多jvm Java应用程序的自动化测试。它包含了一些被设计用来解决这种类型的测试中出现的问题的特性。Byteman在四个主要领域为测试自动化提供了明确的支持:

  • 跟踪特定代码路径的执行并显示应用程序或JVM状态
  • 通过改变状态、进行计划外的方法调用或强制执行意外的返回或抛出来破坏正常执行
  • 编排由独立应用程序线程执行的活动的计时
  • 监控和收集汇总应用程序和JVM操作的统计信息

Byteman下载

安装:

vim /etc/profile

export BYTEMAN_HOME=/root/byteman-download-4.0.23/bin

 export PATH=$PATH:$BYTEMAN_HOME/bin

source /etc/profile

启动应用:

java -jar  -javaagent:/root/byteman-download-4.0.23/lib/byteman.jar=listener:true,boot:/root/byteman-download-4.0.23/lib/byteman.jar -Dorg.jboss.byteman.transform.all  shushan-server-v2-0.0.1-SNAPSHOT.jar
package com.kexuexiong.shushan.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import org.springframework.stereotype.Controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import com.kexuexiong.shushan.service.BannerService;
import com.kexuexiong.shushan.entity.Banner;
import org.springframework.beans.factory.annotation.Autowired;

/**
 * <p>
 * 轮播图 前端控制器
 * </p>
 *
 * @author kexuexiong
 * @since 2024-04-22
 */
@Controller
@Slf4j
@RequestMapping("/banner")
public class BannerController {


    @Autowired
    private BannerService bannerService;

    @GetMapping(value = "/")
    public ResponseEntity<Page<Banner>> list(@RequestParam(required = false) Integer current, @RequestParam(required = false) Integer pageSize) {
        log.info("banner list");

        
        if (current == null) {
            current = 1;
        }
        if (pageSize == null) {
            pageSize = 10;
        }
        Page<Banner> aPage = bannerService.page(new Page<>(current, pageSize));
        return new ResponseEntity<>(aPage, HttpStatus.OK);
    }

    @GetMapping(value = "/{id}")
    public ResponseEntity<Banner> getById(@PathVariable("id") String id) {
        return new ResponseEntity<>(bannerService.getById(id), HttpStatus.OK);
    }

    @PostMapping(value = "/create")
    public ResponseEntity<Object> create(@RequestBody Banner params) {
        bannerService.save(params);
        return new ResponseEntity<>("created successfully", HttpStatus.OK);
    }

    @PostMapping(value = "/delete/{id}")
    public ResponseEntity<Object> delete(@PathVariable("id") String id) {
        bannerService.removeById(id);
        return new ResponseEntity<>("deleted successfully", HttpStatus.OK);
    }

    @PostMapping(value = "/update")
    public ResponseEntity<Object> update(@RequestBody Banner params) {
        bannerService.updateById(params);
        return new ResponseEntity<>("updated successfully", HttpStatus.OK);
    }
}

注入规则:
ruleList.btm:

RULE trace bananerList entry
CLASS com.kexuexiong.shushan.controller.BannerController
METHOD list
AT ENTRY
IF true
DO throw new RuntimeException("list int")
ENDRULE

RULE trace bananerList exit
CLASS com.kexuexiong.shushan.controller.BannerController
METHOD list
AT EXIT
IF true
DO throw new RuntimeException("list out")
ENDRULE

规则解析:官方文档

  ######################################
  # Example Rule Set
  #
  # a single rule definition
  RULE example rule
  # comment line in rule body
  . . .
  ENDRULE

规则是在脚本中定义的,脚本由一系列规则定义和注释行交错组成。注释可以出现在规则定义的正文中,也可以出现在定义之前或之后,但注释必须与规则文本分开。注释是以#字符开头的行:

规则事件规范标识与目标类关联的目标方法中的特定位置。目标方法可以是静态方法,也可以是实例方法或构造函数。如果没有指定详细位置,则默认位置是目标方法的入口。因此,单个规则的基本模式如下:

  # rule skeleton
  RULE <rule name>
  CLASS <class name>
  METHOD <method name>
  BIND <bindings>
  IF  <condition>
  DO  <actions>
  ENDRULE

rule关键字后面的规则名称可以是任何自由格式的文本,但限制是它必须包含至少一个非空格字符。规则名称不必是唯一的,但如果它们清楚地标识规则,则在调试规则脚本时显然会有所帮助。每当在解析、类型检查、编译或执行过程中遇到错误时,都会打印规则名称。

class和method关键字后面的类名和方法名必须在同一行。类名可以标识带有或不带有包限定符的类。方法名可以标识有或没有参数列表或返回类型的方法。构造函数方法使用特殊名称标识,类初始化方法使用特殊名称标识。例如,

# class and method example
  RULE any commit on any coordinator engine
  CLASS CoordinatorEngine
  METHOD commit
  . . .
  ENDRULE

此规则将仅匹配CoordinatorEngine包中的类 com.arjuna.wst11.messaging.engines,并且仅匹配没有参数且返回类型为 State 的方法提交。请注意,在此示例中,未指定类 State 的包。类型检查器将从省略参数或返回类型的匹配方法中推断出参数或返回类型的包。前面的示例还使用了位置说明符AT LINE。line 关键字后面的文本必须能够被解析以得出整数行号。这会指示代理在源代码中特定行的开头插入触发器调用。注意:

Byteman 代理通常不会转换包中的任何类java.lang,也永远不会转换包中的类org.jboss.byteman,即 byteman 包本身。

可以通过使用(内部格式) 分隔符来指定内部类,以区分内部类与其封闭的外部类 o r g . m y . L i s t 分隔符来指定内部类,以区分内部类与其封闭的外部类org.my.List 分隔符来指定内部类,以区分内部类与其封闭的外部类org.my.ListCons, 例如Map E n t r y Entry EntryWrapper。
其他详细的参考官方文档。

# class and method example 2
  RULE commit with no arguments on wst11 coordinator engine
  CLASS com.arjuna.wst11.messaging.engines.CoordinatorEngine
  METHOD State commit()
  AT LINE 324
  . . .
  ENDRULE

注册注入规则:

bmsubmit.sh  -l /root/bytemanScript/ruleList.btm

在这里插入图片描述

请求访问:
在这里插入图片描述
在这里插入图片描述

卸载注入:

bmsubmit.sh -u /root/bytemanScript/ruleList.btm

在这里插入图片描述

卸载后访问:
在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2048369.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

商用自动油炸机流水线 鸡米花油炸设备的优势;

油炸机的优势主要包括操作简单、一机多用、油水分离、大容量油缸、过滤残渣设置、自动出料设置、智能控制面板、材质优良。 操作简单‌&#xff1a;油炸机操作简单&#xff0c;可单人操作&#xff0c;保证了操作人员的身体健康&#xff0c;无油烟&#xff0c;减少了厨房的污染。…

TinyWebserver的复现与改进(6):定时器处理非活动连接

如果客户端长时间没有动作&#xff0c;会占用了许多连接资源&#xff0c;严重影响服务器的性能。因此需要通过实现一个服务器定时器&#xff0c;处理这种非活跃连接&#xff0c;释放连接资源。 定时器处理流程 SIGALARM触发&#xff1a;整个流程开始于一个 SIGALARM 信号&…

Golang基于DTM的分布式事务TCC实战

Golang基于DTM的分布式事务SAGA实战-CSDN博客 源代码&#xff1a;https://github.com/Ssummer520/dtm-gin 代码在宿主机运行 docker network:bridge docker安装,安装成功后可以访问http://localhost:36789/ 打开dtm事务web-ui docker run -itd --name dtm -p 36789:36789 -p…

阿布吞的基础使用——Ubuntu

Ubuntu是Linux系统的发行版&#xff0c;Linux操作系统中比较流行的一个版本&#xff0c;广泛用于个人电脑、服务器和嵌入式设备。今天来简单讲解一下Ubuntu的基础使用。 1. 桌面环境 登录&#xff1a;安装完成后&#xff0c;启动计算机&#xff0c;输入用户名和密码登录到 Ub…

基于springboot的车辆违章信息管理系统

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

【CMake】学习笔记1

文章目录 1. CMake概述2. 编写一个简单的CMakeLists.txt2.1注释2.1.1 注释行2.1.2 块注释 2.1 只有源文件 3. CMake中set使用set 基本使用set指定使用C标准set指定输出路径 4. 搜索文件 1. CMake概述 CMake 是一个项目构建工具&#xff0c;并且是跨平台的。关于项目构建我们所熟…

【安全与管理并重】揭秘公司老板如何平衡信任与效率,利用非授权监控软件优化管理!

企业面临着前所未有的竞争压力&#xff0c;同时还需要确保内部管理的有效性和数据的安全性。如何在信任与效率之间找到平衡点&#xff0c;成为了许多公司老板关注的重点。安企神软件作为一款集数据防泄密、行为监控与流程化管理于一体的综合性解决方案&#xff0c;为企业提供了…

SpringCloud集成XXL-JOB定时任务

项目场景&#xff1a; XXL-JOB是一个分布式任务调度平台&#xff0c;它能够帮助开发者轻松地实现任务的定时执行、任务调度和任务管理 接入步骤 下载XXL-JOB压缩包 链接: xxl-job XXL-JOB做为子模块 将压缩包解压&#xff0c;项目二级新建目录xxl-job&#xff0c;放入目录…

后端Spring/SpringBoot框架基础介绍

1.Spring基础介绍 spring官网&#xff1a;https://spring.io/ 官方对spring的描述&#xff1a;使java更快、更容易、更安全&#xff0c;聚焦于速度、简洁和生产力。并且是全世界最流行的Java框架。 Spring如今已经形成开发生态圈&#xff0c;它提供若干个子项目&#xff0c;每…

超声波清洗机哪个牌子效果最好?四个可靠的超声波眼镜清洗机品牌推荐

作为一个常年佩戴眼镜的用户&#xff0c;还是养宠家庭&#xff0c;对于眼镜的清洗&#xff0c;一直是倍感困扰的&#xff0c;养宠的家庭&#xff0c;每天镜片上极易沾染灰尘&#xff0c;用眼镜布擦拭真的很容易把镜片刮花。尽管有时候路过眼镜店会进去清洗&#xff0c;但是终归…

【数学建模】LINGO编程

LINGO是一种专门用于求解数学规划问题的软件包。由于LINGO执行速度快&#xff0c;易于方便地输入、求解和分析数学规划问题&#xff0c;因此在教学、科研和工业界得到了广泛应用。LINGO主要用于求解线性规划、非线性规划、一次规划和整数规划等问题&#xff0c;也可用于求解一些…

Next-Key Lock 详解及其在 REPEATABLE READ 隔离级别中的作用

Next-Key Lock 是 MySQL InnoDB 引擎中使用的一种锁定机制&#xff0c;专门用于在 REPEATABLE READ 隔离级别下防止幻读&#xff08;Phantom Reads&#xff09;。它结合了行锁&#xff08;Record Lock&#xff09;和间隙锁&#xff08;Gap Lock&#xff09;&#xff0c;能够在高…

抽卡机小程序,开启全新拆卡乐趣

近段时间&#xff0c;盲盒卡牌市场异常火爆&#xff0c;最近爆火的“小马宝莉”系列卡牌就深受消费者的喜爱&#xff0c;受到了广泛关注&#xff0c;同时也推动了卡牌市场的快速发展&#xff01;盲盒卡牌拥有隐藏款卡牌和限量款卡牌&#xff0c;具有非常大的收藏价值&#xff0…

图纸防泄密高招:5款经典的图纸加密软件

图纸加密软件是专为保护设计图纸等敏感文件而设计的加密工具&#xff0c;通过先进的加密技术确保文件在传输、存储和使用过程中的安全性。小编试用后发现了5款经典的图纸加密软件。 1. 安企神软件 7天试用https://work.weixin.qq.com/ca/cawcde06a33907e60a 重点介绍&#xf…

2-68 基于matlab的小波分解子模式和盒维数的车型识别程序

基于matlab的小波分解子模式和盒维数的车型识别程序&#xff0c;可以选择不同车型&#xff0c;包括小车、中车、大车。GUI可视化界面操作&#xff0c;已包括多种图片。程序已调通&#xff0c;可直接运行。 2-68 小波分解子模式和盒维数 - 小红书 (xiaohongshu.com)

软件工程的核心原则:KISS, DRY, SOLID, YAGNI

软件工程的核心原则&#xff1a;KISS, DRY, SOLID, YAGNI — 深入解析与实践指南 引言 在软件开发的广阔领域中&#xff0c;原则和实践是构建高质量、可维护系统的基石。本文将深入探讨四个核心原则&#xff1a;KISS&#xff08;保持简单&#xff0c;愚蠢&#xff09;、DRY&a…

Element-05.组件-Form表单

一.Form表单组件 Form表单组件可以定义在Dialog对话框组件中 与Dialog对话框组件中的属性dialogTableVisible相似&#xff0c;dialogFormVisible的默认值也为false&#xff0c;这也说明了Dialog对话框中的Form表单默认是不显示的&#xff0c;只有当绑定的click事件发生后才会将…

解决麒麟 V10 SP1 升级 Python 后 yum dnf不可用问题

目录 一、前提概要 二、解决办法 1、卸载原有的 python 2、安装 Python 3.7.9 rpm 3、安装一系列 yum 相关 rpm 4、rpm 包下载 一、前提概要 在部署 gaussDB 的时候&#xff0c;安装代理时要求 python 版本满足 3.7.9&#xff0c;但已安装的麒麟 V10 内集成的 python 版…

探索工业互联网智能赋能智能制造算法综述

概述 文档地址&#xff1a;https://arxiv.org/pdf/2312.16174 源码地址&#xff1a;https://github.com/microsoft/Cream.git 由于激烈的竞争环境和日益增长的个性化定制需求&#xff0c;制造业面临着数字化转型和升级的压力。为我们指明了前进的方向。然而&#xff0c;现有研…

stable diffusion inapinting(img2img+inpaint/inapint-model)

https://zhuanlan.zhihu.com/p/681250295https://zhuanlan.zhihu.com/p/681250295AIGC专栏4——Stable Diffusion原理解析-inpaint修复图片为例_diffusion inpaint-CSDN博客文章浏览阅读1.7w次,点赞42次,收藏79次。Inpaint是Stable Diffusion中的常用方法,一起简单学习一下。…