gpt4 book ai didi

java - 如何调试使用 JVMTI 代理设置断点的 Java 应用程序(无法获取必要的 JVMTI 功能)

转载 作者:行者123 更新时间:2023-12-02 03:34:12 34 4
gpt4 key购买 nike

我想调试使用我编写的 jvmti 代理的 java 应用程序。这似乎仅在 jvmti 代理未尝试启用“can_generate_breakpoint_events”功能时才有效。

尝试启用断点功能并在 Debug模式下启动应用程序会导致以下错误:

ERROR: JVMTI: 98(Unknown): Unable to get necessary JVMTI capabilities. [..\src\agent.cpp:437]

有什么方法可以调试使用 jvmti 代理并设置断点的应用程序吗?

我检查了Java JVMTI doesn't work alongside -Xdebug -Xrunjdwp但接受的答案似乎并不正确,因为它实际上似乎也取决于启用的功能。

我知道分析器(如 YourKit 等)也使用 jvmti 代理,并且仍然允许您在 Debug模式下运行应用程序(好吧,也许它们只是没有使用导致这些冲突的功能)。

最佳答案

TL;DR

要调试 JVM 代理,请使用 native 代码调试器,例如gdb。

更多细节

Java 应用程序中有两种代码 - Java 代码(应用程序本身和基于 java.lang.instrument 的代理)和 native 代码(Java 类的 native 方法、JVMTI 代理和 VM 本身)。要调试前者,您需要使用 Java 调试器(使用 JDWP)。要调试后者,您需要使用常规的 native 代码调试器,就像调试 C/C++ 程序一样。如果您想同时调试 Java 和 native 代码,那么您需要使用这两个调试器。

关于 JVMTI 代理、JDWP 以及需要什么

JVM 可能会在多个代理一起运行的情况下启动,每个代理都有自己的 JVMTI 环境(功能、事件监听器等)。但是,如果多个代理(或单个代理的多个实例),请使用相同的资源,例如相同的全局变量,那么它们可以相互影响(JDK 的 JDWP 代理就是这种情况 - 这就是为什么您最多可以有一个 -agentlib:jdwp)。

JDWP 是 Java 调试器的协议(protocol)。 JDWP 代理是 JDK 附带的 JVMTI 代理,它支持 JVM 中的 JDWP 协议(protocol)。它是一个普通的 JVMTI 代理,可以与其他代理一起启动。

关于java - 如何调试使用 JVMTI 代理设置断点的 Java 应用程序(无法获取必要的 JVMTI 功能),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37643025/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com