JDWP JVMTI Debug 这几个名词有什么区别和联系
以我目前的理解看来,jdwp是基于jvmti实现的一个协议,它可以实现由其它进程控制jvm的运行以及获取jvm的状态。而通过jdwp就可以简单的实现debug
如果要自己实现一个jdwp,就会很麻烦
有两个方式:
1:编写一份MyAgent.java代码
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");
}
}
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
这个情况下,会调用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的完整路径
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!