求助>关于 JAVA Agent/Debugger 设计的一些疑问>
3回复
1月前

关于 JAVA Agent/Debugger 设计的一些疑问



jdwp 协议是 JVMTI 的通信基础,而且 IDE 都是直接实现 jdwp 协议来和目标 JAVA 进程(远程或者本地)进行 DEBUG 通信的。

如果我想设计一个 Agent 程序,没有动态 Attach 的需求,启动时指定就好。

那么我是不是也可以通过 DEBUG 这种方式,启动参数上直接开启 jdwp 调试端口,然后我的 Agent 直接实现 jdwp 协议,和目标 java 进程通信。

-agentlib:jdwp=transport=dt_socket,address=127.0.0.1:60557,suspend=y,server=n 

而不是像 Arthas 那样,在 Instrumentation/JVMTI 上又弄了一套私有的通信协议和客户端通信?

-javaagent:/path/to/debugger-agent.jar
971 阅读
请先登录,再评论

回复列表

https://a.perfma.net/img/2382850
ferdi1月前

首先,JavaAgent其实没法完全实现jdwp,因为JavaAgent没法调用大部分JVMTI开放的接口,但是如果你在JavaAgent里再去调用JNI那就是另一回事了,能实现但是没必要;所以基于这个基础jdwp没法作为一个通用的通信基础;arthas才用telnet和他自己一套命令机制,足够简单,也方便他自己后续扩展其实是更好的选择,因为他主要功能不是为了debug;最后如果你用JVMTI实现jdwp协议那就跟原生的java debug是一样的,也就跟第一个一样,可以但没必须要;但是如果可以去增强jdwp本身,那么就有意义,比如在断点的时候获取stack frame/opcode等,这个也是我们目前在研究的一个方向,有兴趣的话可以详细讨论~

3
空无1月前
回复 空无:

关键还是“没必要”,通过 Instrumention 这种 Agent 的形式已经可以满足要求,没有必要直接用JNI JVMTI 👍

回复
空无1月前
回复 ferdi:

明白了,感谢公与大佬的耐心解答👍

回复