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

以我目前的理解看来,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=q=456

这会去path中找foo.dll或者foo.so(这取决与操作系统),并且传入参数q等于456

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

posted @   dronff  阅读(74)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示