- 浏览: 422699 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (216)
- JAVA (136)
- Python (7)
- 娱乐生活 (10)
- Cloud (5)
- Linux (9)
- JavaScript (7)
- Oracle (11)
- Groovy (1)
- Mysql (3)
- NoSQL (4)
- tomcat (6)
- apache/nginx (16)
- C/C++ (5)
- 设计模式 (7)
- 架构 (8)
- openstack (1)
- hadoop (2)
- 数据仓库 (7)
- linkedin (17)
- JavaGeeker (54)
- Google (9)
- opensource (44)
- spring (21)
- Performance (39)
- lua (2)
- Rust (1)
- WASM (0)
- Golang (0)
- Microservice (1)
- Blockchain (0)
- Web3 (0)
- 边缘计算 (0)
- 硅谷 (0)
- 密码学 (0)
- BTC (0)
- Ethereum (0)
最新评论
-
u012916287:
请问大神。这个架构是你们公司的产品吗?最近准备搞一个基于spr ...
基于DDD的微服务架构设计 -
铁柱他哥:
能给我一份源码码,我这儿边出了点儿问题我参考一下
Jersey采用JSP模板 -
hch2012:
大神,膜拜! ...
基于DDD的微服务架构设计 -
cywhoyi:
lionld23 写道等着看呢,速度速度我是抽空再写的,整篇文 ...
从demo到支持高并发 -
lionld23:
等着看呢,速度速度
从demo到支持高并发
写在前面的话:Btrace系列是我将平时里学习和使用Btrace的一些经验的总结,拿出来和大家一起交流一下,希望在这个过程中能找寻出自己理解或使用上的错误之处。
一、Btrace的简介:
Btrace是由Kenai 开发的一个开源项目,是一种动态跟踪分析JAVA源代码的工具。它可以用来帮我们做运行时的JAVA程序分析,监控等等操作,当然,它也不是万能的,BTrace也有一些使用上的限制,如:不能在脚本中新建类等等,这些在官方网站上有很详细的介绍,大家有兴趣可以查看:http://kenai.com/projects/btrace/pages/UserGuide。
二、JDK6的几个新特性:
Btrace是由:Attach API + BTrace脚本解析引擎 + ASM + JDK6 Instumentation组成,这里要注意最后一项是JDK6的Instumentation,为什么一定要是JDK6呢?我们就要来看一下JDK6为我们提供了什么:
1、虚拟机启动后的Instumentation:
Instumentation早在JDK5的时候就已经提出了,但是它有个局限性,premain函数只能在main函数之前被运行(对于Instumentation不熟悉的请去Sun官网查看),而JDK6之后提供了一个叫做agentmain的函数,它可以在main函数运行后在运行,代码如下:
- public static void agentmain(String args, Instrumentation inst)
- public static void agentmain(String args)
这个函数的功能通premain函数一样,可以对类进行各种操作。同premain函数一样,在manifest 文件里面设置“Agent-Class”来指定包含 agentmain 函数的类。
2、Instumentation提供的新方法retransformClasses:
这个新方法可以在agentmain函数中调用,它的功能和redefineClasses 一样,可以修改类的定义且是批量的。
3、BootClassPath和SystemClassPath的动态指定:
在JDK6之前,我们知道可以通过系统参数或者虚拟机启动参数,设置一个虚拟机运行时的boot class加载路径和system class加载路径,但是在启动后,这个路径是不可以修改的,并且,我们要在启动后再去加载一个*.jar文件是不可能的,但是在JDK6以后,这个规定被打破了,可以使用Instrumentation的appendToBootstrapClassLoaderSearch和appendToSystemClassLoaderSearch来修改路径或加载新的*.jar(注意:虽然实际的classpath被修改了,但是在property中的java.class.path却没有受任何影响)。
正因为以上的新特性,才缔造出了Btrace的想法以至于最后的实现。
三、Btrace的原理:
Btrace首先是通过Attach API中提供的VirtualMachine.attach(PID)方法来获得要监控的JVM,然后使用VirtualMachine.loadAgent("*.jar")方法来加载jar文件,这个jar文件中会包含Btrace的一个很重要的类com.sun.btrace.agent.Main,这个类里定义了如下的函数:
- public static void premain(String args, Instrumentation inst) {
- main(args, inst);
- }
- public static void agentmain(String args, Instrumentation inst) {
- main(args, inst);
- }
这里两个函数都调用了一个main方法,如下:
- private static synchronized void main(final String args, final Instrumentation inst) {
- ......
- inst.appendToBootstrapClassLoaderSearch(new JarFile(new File(path)));
- ......
- inst.appendToSystemClassLoaderSearch(new JarFile(new File(path)));
- ......
- startServer();
- }
这里省去了不必要的代码,主要三行代码,头两行不用解释,上面已经说过用途了,第三行解释一下,代码如下:
- private static void startServer() {
- ......
- while (true) {
- try {
- ......
- handleNewClient(client);
- } catch (RuntimeException re) {
- if (isDebug()) debugPrint(re);
- } catch (IOException ioexp) {
- if (isDebug()) debugPrint(ioexp);
- }
- }
- }
关键看一下handleNewClient(client)方法的调用,这个是修改类定义的地方,如下:
- private static void handleNewClient(final Client client) {
- ......
- inst.addTransformer(client, true);
- ......
- inst.retransformClasses(classes);
- }
这两句话就实现了对现有内存中的类定义的替换,当在一次调用new创建一个新对象时就会使用新的类定义,而老的已经生成的类对象是不会收到干扰的。
那又是谁取执行了对类定义的修改呢,这个是由BTrace脚本解析引擎 + ASM来实现的,脚本引擎负责解析我们所写的脚本,而ASM来对JAVA的字节码进行增强修改。你在Btrace的com.sun.btrace.agent.Client中可以看到ASM的影子,代码如下:
- abstract class Client implements ClassFileTransformer, CommandListener {
- static {
- ClassFilter.class.getClass();
- ClassReader.class.getClass();
- ClassWriter.class.getClass();
- ......
- }
- private byte[] instrument(Class clazz, String cname, byte[] target) {
- byte[] instrumentedCode;
- try {
- ClassWriter writer = InstrumentUtils.newClassWriter(target);
- ClassReader reader = new ClassReader(target);
- Instrumentor i = new Instrumentor(clazz, className, btraceCode, onMethods, writer);
- ......
- }
现在我们在回顾一下整个流程,用Attach API附加*.jar然后使用BTrace脚本解析引擎 + ASM来实现对类的修改,在使用Instumentation实现类的内存替换,完毕!perfect!BTrace原来也就这么回事,但是我们不得不佩服开发团队的思维和整合能力,向牛人致敬!
发表评论
-
支持MapDB的Eventstore
2017-04-11 18:15 1539背景:现在微服务大行其道,虽然微服务开山鼻祖是不建议在微服 ... -
类文件结构解析
2017-03-30 15:39 2093就很好奇反编译出来自己写的代码,这里主要使用了五个工具,i ... -
使用Spring-Cloud搭建微服务架构
2017-02-16 14:00 6081搭建一套微服务架构的,我个人觉得必须如下模块: con ... -
电路熔断器(Circuit Breaker)自我思考
2017-01-07 21:20 2160作者:美团点评技术团 ... -
DDD分布式架构设计的BASE一致性
2016-08-09 16:32 2482问题背景: 在DDD的架构设计中最难以解决的 ... -
支持分布式的callback
2016-08-03 13:10 1128项目背景: 之前在某次培训的分享中,谈到r ... -
使用netty完成proxy-server
2016-06-13 16:34 0项目背景: 现在主流的android与back ... -
从demo到支持高并发
2016-02-25 18:16 3461前言: Java语言作用很大,因有众多分门杂类的 ... -
Vert.x3支持JWT
2015-12-28 20:48 3391知识背景: ... -
MapDB的spring整合使用
2015-12-15 23:26 5094MapDB是一个快速、易用 ... -
MapDB与Spring整合使用
2015-12-14 22:58 27MapDB是一个快速、易 ... -
MapDB与Spring整合使用
2015-12-14 22:56 2MapDB是一个快速、易用的嵌入式Java数据库引擎,它提 ... -
MapDB与Spring整合使用
2015-12-14 22:55 2MapDB是一个快速、易用的嵌入式Java数据库引擎,它提 ... -
基于Spring支持JMX
2015-11-08 00:43 3304前言: 基于Vert写的组件,其中在使用过程 ... -
Vertx与Spring配合完成DML操作
2015-10-29 14:26 11250前言 vertx相较于Tomcat不同之处 引用osc ... -
基于Netty4网站架构
2015-10-28 10:44 11832前言: 本人所在公司在业内比较知名的公司, ... -
异常处理
2015-10-08 16:12 2791首先提倡下Hibernate的验证器,功能强大且使用方面,H ... -
依托于Spring重加载
2015-10-05 22:13 1111这几天发现单位同事都在使用JRebel作为热部署工具,它集合 ... -
绑定请求
2015-10-03 10:01 602public abstract class ThreadC ... -
服务端校验
2015-09-29 17:47 0现在Javer总是提框架来框架去,其实我挺讨厌这类人的,当然我 ...
相关推荐
在本MATLAB脚本程序中,MPC被应用于道路场景的轨迹跟踪任务,实现了车辆或机器人实时、精确地跟随预设轨迹行驶。这种技术广泛应用于自动驾驶汽车、无人机以及其他需要精确路径控制的领域。 首先,我们要理解MPC的...
OllyDbg(简称OD)是一款16/32位Windows动态调试器,它允许用户跟踪程序执行,查看内存,修改指令,以及进行各种调试任务。OD的强大之处在于它的脚本功能,可以创建自定义的脚本来自动化复杂的逆向工程任务,如脱壳...
在 Sqlmap 中,Tamper 脚本的分析是对 Tamper 脚本的执行过程的跟踪和分析,这种方式可以帮助我们更好地理解 Tamper 脚本的工作机理和实现原理。 Tamper 脚本的分析是 Sqlmap 中最重要的组件之一,它能够对各种类型...
`说明.txt` 文件可能是对整个过程的详细说明,包括如何运行shell脚本,脚本的工作原理,以及可能遇到的问题和解决方案。阅读这份说明有助于理解脚本的使用方法和潜在问题。 执行Oracle SQL脚本的shell脚本通常包含...
脚本技术在OD中的应用主要体现在自定义插件和自动化脚本上,这些脚本可以扩展OD的功能,执行特定的任务,如自动跟踪、分析、解密等。OD脱壳脚本通常由熟练的逆向工程师编写,包含了一系列复杂的指令序列,用于识别并...
通过脚本,用户可以执行一系列复杂指令,例如自动跟踪特定函数,分析内存变化,或者在满足特定条件时触发动作,这对于逆向工程和恶意软件分析等任务非常有用。 OllyScript语法结构清晰,它结合了汇编语言的精度和...
1. **设置脚本**:通常,一个Systrace脚本会包含一系列的命令行选项,指定要记录的跟踪类别、时间长度等参数。例如,`systrace.py -o output.html --time=5 -c gfx view`将记录5秒的GPU和视图系统相关的事件,并生成...
在IT行业中,批处理脚本是一种非常实用的自动...通过理解批处理脚本的基本原理和命令,用户可以创建自己的脚本来满足各种需求,包括数据安全保护。在使用过程中,一定要注意安全和隐私,遵循最佳实践,确保信息的安全。
同时,学习和理解脚本的工作原理也是提升逆向工程技能的好方法。对于初学者来说,可以先从简单的脚本开始,逐步深入到更复杂的调试任务。而对经验丰富的使用者,这些脚本则提供了快速解决问题和提升工作效率的工具。...
在IT运维领域,批量操作是提高工作效率的关键。本压缩包"【批量下载】自动加域脚本等.zip"中包含的资源,显然专注于自动化管理和...理解并掌握这些脚本的使用方法和背后的原理,对于提升IT运维效率和管理水平至关重要。
首先,手册简要介绍了Unity3D脚本的工作原理,包括脚本如何通过附加到游戏物体上来工作。在Unity3D中,脚本被附加到游戏物体上,形成一种组件化的结构。游戏中的行为通过脚本中的函数在特定的时机被调用,比如Update...
总的来说,这个京东自动抢茅台脚本项目涉及到网络编程、自动化、模拟用户行为和可能的反反爬虫策略,对于想要了解这一领域的用户,需要有一定的编程基础和对网络请求原理的理解。使用时,务必遵循京东的使用协议,并...
首先,我们要理解游戏脚本的基本原理。通常,游戏脚本是通过模拟用户输入来自动化执行一系列操作,例如移动角色、点击按钮等。在这个特定的案例中,我们使用Python来抓取Windows游戏窗口的图像,然后通过图像处理...
QTP的录制功能使得测试人员可以轻松创建测试脚本,只需通过实际操作应用,QTP会自动跟踪并记录这些操作。在这个计算器脚本中,可能记录了点击按钮、输入数字等动作,并转化为可执行的代码。 **三、QTP对象库** QTP...
此脚本通过分析市场价格行为,帮助交易者识别并跟踪当前市场趋势,从而制定更加精准的交易决策。它的工作原理是基于一定的技术分析算法,如移动平均线、趋势线或其他技术指标,以确定市场的上升、下降或横盘趋势。 ...
"NEWS"文件可能记录了AS脚本查看器的更新历史,包括新功能、改进和修复的bug,对于跟踪软件的发展和变化非常有用。 "README"文件通常会介绍软件的用途、如何使用以及安装步骤等基本信息,是初次接触软件时的重要...
本文将深入探讨这一脚本的工作原理、使用方法以及其在实际交易中的应用。 首先,"外汇下单脚本"主要由两个核心文件组成:doublePending_10_Orders_SL50_TP50_Script.ex4和doublePending_10_Orders_SL50_TP50_Script...
在调试过程中,Visual Studio 2010的调试工具将非常有用,可以设置断点,查看变量值,跟踪代码执行流程,帮助定位和解决问题。 此外,为了确保代码的健壮性,你需要处理可能出现的异常情况,例如连接失败、权限不足...
- **shell跟踪选项**:介绍了如何启用shell的跟踪功能,以便于调试脚本运行过程。 - **简单输出语句**:讲解了如何使用echo或printf命令输出信息。 - **根据调试层次控制输出**:通过设置不同的调试级别,控制输出的...
本文将深入探讨这个脚本的工作原理、应用场景及使用方法。 一、LBR_Paint_Bars脚本概述 "LBR_Paint_Bars"脚本是由LBR团队开发的,旨在增强MT5图表的可视化效果。通过自定义颜色和样式来绘制蜡烛图,此脚本能够帮助...