原文:http://ivanzhangwb.github.io/btrace-vm-attach-api/
BTrace的特点之一就是可以动态Attach到一个运行的JVM进程上,然后根据BTrace脚本来对目标JVM进行相应的操作。
这篇文章主要关注JVM Attach API
,JVM的 Attach有两种方式:
-
指定javaagent参数
运行时动态attach
指定参数
这种方式的特点就是在目标JVM启动时,就确定好了要加载什么样的代理对象。
比如命令形式:java -javaagent:xxxx.jar MainClass
用一个例子来说明下:
一个普通程序入口
public class TestMain {
public static void main(String[] args) throws InterruptedException {
System.out.println("Hello");
}
}
Agent对象
import java.lang.instrument.Instrumentation;
import java.io.*;
public class TestAgent {
public static void agentmain(String args, Instrumentation inst)
throws Exception {
System.out.println("Args:" + args);
}
public static void premain(String args, Instrumentation inst)
throws Exception {
System.out.println("Pre Args:" + args);
Class[] classes = inst.getAllLoadedClasses();
for (Class clazz : classes) {
System.out.println(clazz.getName());
}
}
}
这个类比较简单,最终它会在目标类的Main方法执行之前,执行premain方法,其主要动作是将以及加载的类答疑in出来。 我们需要将这个类打包成jar文件,以便在目标JVM启动时候,以参数形式指定给它。打成jar的同时,设定MANIFEST.MF文件的内容。 告知目标JVM该如何处理.
Agent-Class: TestAgent
Premain-Class: TestAgent
Can-Redine-Classes: true
Can-Retransform-Classes: true
最终用jar命令将其打包。 比如jar cvmf MANIFEST.MF xxx.jar TestAgent
使用方法:
java -javaagent:xxx.jar TestMain
####动态Attach,并load对应的Agent
这种方式与之前指定参数的不同在于,其可以在JVM已经运行的情况下,动态的附着上去,并可以动态加载agent。
同样我们也来看下一个例子: 目标JVM运行的类, 这个类会隔一秒钟打印一句话。 JVM会一直运行(模拟已经运行的JVM进程)
public class TestMain {
public static void main(String[] args) throws InterruptedException {
while(true){
Thread.sleep(10000);
new Thread(new WaitThread()).start();
}
}
static class WaitThread implements Runnable {
@Override
public void run() {
System.out.println("Hello");
}
}
}
Agent对象
import java.lang.instrument.Instrumentation;
import java.io.*;
public class TestAgent {
public static void agentmain(String args, Instrumentation inst)
throws Exception {
System.out.println("Args:" + args);
}
public static void premain(String args, Instrumentation inst)
throws Exception {
System.out.println("Pre Args:" + args);
Class[] classes = inst.getAllLoadedClasses();
for (Class clazz : classes) {
System.out.println(clazz.getName());
}
}
}
代码同上,不同的是,动态加载agent的情况下,被调用的是agentmain
方法, 其会在JVMload的时候,被调用。 为了简单示例,只打印了传递给Agent的参数。
同样的,这个类也需要打包成jar。
Agent-Class: TestAgent
Premain-Class: TestAgent
Can-Redine-Classes: true
Can-Retransform-Classes: true
使用方式
动态附着到对应的JVM需要使用到JDK的Attach API
import com.sun.tools.attach.VirtualMachine;
public class Main {
public static void main(String[] args) throws Exception{
VirtualMachine vm =null;
String agentjarpath = "/home/ivanzhangwb/test.jar"; //agentjar路径
vm = VirtualMachine.attach("9730");//目标JVM的进程ID(PID)
vm.loadAgent(agentjarpath, "This is Args to the Agent.");
vm.detach();
}
}
最终我们一旦运行这个Main方法, 其就会动态的附着到我们对应的JVM进程中,并为目标JVM加载我们指定的Agent,以达到我们想做的事情, 比如BTrace就为在附着到目标JVM后,开启一个ServerSocket,以便达到与目标进程通讯的目的。
分享到:
相关推荐
《MK-Unlocker-VM15.5:解锁VMware Workstation Pro的黑苹果之旅》 在虚拟化技术领域,VMware Workstation Pro一直以其强大的功能和稳定的性能深受用户喜爱。然而,对于苹果操作系统的爱好者来说,由于Apple的严格...
标题中的"Ax86_8.1-R2-VM-32bit.7z"指的是一个基于Android x86的32位操作系统镜像,它已经以7z压缩格式打包。"8.1-R2"表示这个版本是Android 8.1的第二个修订版,通常意味着它修复了一些上一版本的问题并可能包含了...
描述中提到的"PA-VM-ESX-10.0.0.ova"和"Panorama-ESX-10.0.0.ova"是两个OVA(Open Virtual Appliance)文件,这是VMware平台上的虚拟设备格式。这些文件包含预配置的PAN-OS 10.0虚拟防火墙和可能的Panorama管理平台...
Maxine VM: A Metacircular VM for Java in Java Releases (See CHANGELOG for more) 2018-12-05: Maxine VM 2.6.0 Release 2018-10-16: Maxine VM 2.5.2 Release 2018-10-16: Maxine VM 2.5.1 Release 2018-08-27:...
cloudera-quickstart-vm-5.13.0-0- 相关书签。
因为版本的原因镜像在kali官网上已经删除,下载好后直接使用vm打开,登陆账号,密码即可进入使用。
**PyPI 官网下载 | opal-azure-cli-vm-2.2.23.tar.gz** 这个资源是PyPI(Python Package Index)官方提供的一个软件包,名为`opal-azure-cli-vm`,版本号为2.2.23。PyPI是Python开发者发布和分享他们编写的开源...
Ax86_8.1-R2-VM-64bit,android x86 64bit 8.1-r2 vmware 虚拟机,解压后,使用vmware15(至少)新建虚拟机,选择其他 64位-》在导入硬盘处选择此vmdk文件。
Go-Lua5.2VM是基于Google的Go编程语言实现的一个完整的Lua 5.2虚拟机。这个项目旨在为Go程序提供一种内嵌Lua脚本的能力,使得开发者可以在Go程序中利用Lua的灵活性和易读性来编写部分业务逻辑或者扩展功能。下面将...
为了更好地理解这个项目,我们可以查看压缩包内的“skx-go.vm-0276dfc”文件。这个文件可能是项目的某个版本或者是编译后的字节码文件。通过反编译或调试工具,我们可以分析它的结构,进一步了解虚拟机的指令集和...
基本式 驱动器 通口数 配管形式 驱动器 型号 备注 聚乙醛滚轮 硬钢滚轮 2通口3通口2通口3通口 VM120-01-00 VM121-01-00 VM130-01-00 VM131-01-00 ...VM-08B VM-07BS VM-07B VM-06BS VM-06B VM-05B ...VM-30AR 红
《PyPI官网下载:tencentcloud-sdk-python-vm-3.0.355.tar.gz——腾讯云Python SDK深度解析》 在Python的世界里,PyPI(Python Package Index)是开发者们的重要资源库,它提供了丰富的第三方库,使得开发者能够...
Mac版本 官网上下载XAMPP简直都下载不下来,后来通过别的渠道下载下来了,所以决定上传到CSDN中,希望可以帮助到需要的同学。 XAMPP(X-系统,A-Apache,M-Mysql,P-php,P-Phpmyadmin/Perl)这个缩写名称说明了XAMPP...
《Python库 Tencentcloud-sdk-python-vm-3.0.531详解》 在Python的开发环境中,库扮演着至关重要的角色,它们提供了丰富的功能,让开发者能够更高效地完成任务。本文将深入探讨名为"Tencentcloud-sdk-python-vm-3.0...
"libpython3.10-stdlib_3.10.6-1~22.04_i386.deb"则是Python 3.10标准库的一部分,这可能包含了一些用于open-vm-tools的内置功能和API。 在安装这个包时,系统会自动处理这些依赖关系,确保所有必要的库和语言环境...
欧姆龙微小光点/标识(放大器分离) E3C-VS/VMpdf,欧姆龙微小光点/标识(放大器分离) E3C-VS/VM:微小光点,最适合微小物体和标记的检测,最适合检测微小物体与细微的色差。接缝检测。200μ的极线检测。微小段差检测...
标题 "PA-VM-ESX-7.1.0.zip" 暗示这是一个与 VMware ESXi 7.1.0 相关的压缩包,其中可能包含了与更新、安装或配置 ESXi 7.1.0 版本有关的文件。VMware ESXi 是一款业界领先的虚拟化平台,它允许在单一硬件上运行多个...
SG6000-VM虚拟防火墙安装手册.pdf
SG6000镜像文件包含SG6000-CloudEdge-VM01-5.5R2.iso与SG6000-CloudEdge-VM02-5.5R2.iso 可用于hillstone防火墙实验
首先,`tencentcloud-sdk-python-vm-3.0.529.tar.gz`是该SDK在PyPI官网上的一个压缩包文件,包含了 Tencentcloud-sdk-python 的虚拟机(VM)模块。PyPI,全称Python Package Index,是Python软件的官方仓库,提供...