JDWP JVMTI Debug 这几个名词有什么区别和联系

发布时间 2023-09-14 00:21:48作者: dronff

以我目前的理解看来,jdwp是基于jvmti实现的一个协议,它可以实现由其它进程控制jvm的运行以及获取jvm的状态。而通过jdwp就可以简单的实现debug

如果要自己实现一个jdwp,就会很麻烦

有两个方式:

1:编写一份MyAgent.java代码

package org.example;

import java.lang.instrument.Instrumentation;

public class MyAgent {
public static void premain(String agentArgs, Instrumentation inst){
int a = 1;
System.out.println(a);
System.out.println("premain");
}
public static void agentmain(String agentArgs, Instrumentation inst){
System.out.println("agentmain");
}
}
 
并将这份代码打包成jar,将里面的MANIFEST.MF文件内容修改为

Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Built-By: Dronff
Created-By: Apache Maven 3.8.1
Build-Jdk: 1.8.0_202
Premain-Class: org.example.MyAgent
Agent-Class: org.example.MyAgent
Can-Predefine-classes: true
Can-Retransform-Classes: true

然后,这份jar并不能直接启动,而要将他附加在别的java程序上启动

有两种方式,一种是通过jvm option

-javaagent:C:\Users\Dronff\Desktop\javaprojects\TestJVMTI\target\a.jar

这个情况下,会调用premain方法

而另一种则是通过attach方式,这个方式是先启动一份java程序,然后通过jps获取到它的进程号后进行附着

具体可参考

https://zhuanlan.zhihu.com/p/476317425?utm_id=0

第二种方式会在启动后调用agentmain方法

 2:编写cpp代码生成dll/so,这种方式还没试过,大致是要将java目录下的include目录中的jvmti头文件include进去然后进行操作,最后通过-agentpath指定

----------------------------------------------------------------

-agentpath和-agentlib有什么区别?

-agentlib会直接去系统的path环境变量中依次寻找这个dll文件

比如-agentlib:foo=1234=456

这会去path中找foo.dll或者foo.so(这取决与操作系统),并且传入两个参数分别是1234和456

而-agentpath需要传入lib的完整路径