2

I would like to enable debugging at some point on the current JVM without adding the command line parameters -agentlib:jdwp.

Is it possible to do so programmatically from within the current running JVM ? Without any third party libraries ?

Other command line parameters (such as -Djdk.attach.allowAttachSelf=true) can be considered.

VirtualMachine vm = VirtualMachine.attach(Long.toString(ProcessHandle.current().pid()));
vm.loadAgentLibrary("jdwp", "transport=dt_socket,server=y,address=8000,suspend=n");

causes :

com.sun.tools.attach.AgentLoadException: Failed to load agent library: _Agent_OnAttach@12 is not available in jdwp
4

1 回答 1

2

在现代 JVM (Java 6+) 中,代理使用 JVM TI 接口。

JVM 工具接口 (JVM TI) 是开发和监控工具使用的编程接口。它提供了一种检查状态和控制在 Java 虚拟机 (VM) 中运行的应用程序执行的方法。

在 JVM TI 中,您必须启用所需的功能

功能函数允许您更改 JVM TI 可用的功能,即可以调用哪些 JVM TI 函数、可以生成哪些事件以及这些事件和函数可以提供哪些功能。

当(JVM 的哪个状态)取决于供应商时,可以添加哪些功能。JDWP 只是 JVM 和调试器之间的调试协议。它只是像任何其他代理一样利用 JVM TI 的功能。同时,调试功能很可能只能在OnLoad阶段中添加(在大多数 JVM 中)。(即:can_generate_breakpoint_events, can_suspend, ...)

添加功能:通常在函数中使用此OnLoad函数。一些虚拟机可能允许在实时阶段添加一组有限的功能。

这解释了为什么必须在 JVM 启动时声明 jdwp 代理才能向 JVM TI 添加适当的功能。

文档:https ://docs.oracle.com/javase/8/docs/platform/jvmti/jvmti.html#capability

感谢@Holger 指出方向。

于 2021-05-03T10:57:12.377 回答