Java JVMTI 不能与 -Xdebug -Xrunjdwp 一起工作

2022-09-04 07:55:02

在过去的4个小时里,我试图在必须远程运行的Tomcat实例上设置Eclipse TPTP内存分析(即不在Eclipse中)。根据 TPTP 和代理控制器文档,这应该是可能的。

我根据网站上的说明将TPTP组件(4.6.0)与Agent Controller一起安装到我的Eclipse(伽利略)工作台中。为了启用代理,我将以下选项添加到启动 Tomcat 实例的命令行中:

-agentlib:JPIBootLoader=JPIAgent:server=enabled;HeapProf:allocsites=true

并将以下目录添加到 PATH 的前面:

D:\dev\tools\ac\plugins\org.eclipse.tptp.javaprofiler
D:\dev\tools\ac\bin

尝试启动Tomcat时,我一直收到以下错误消息:

ERROR: JDWP unable to get necessary JVMTI capabilities. ["debugInit.c",L279]

我做了很多谷歌搜索,但没有发现任何相关的东西;我尝试重新安装TPTP和各种版本的代理控制器。

最后,问题竟然是我开始使用“jpda”选项启动Tomcat,catalina.bat将其转换为

-Xdebug -Xrunjdwp:transport=.....

删除“jpda”命令参数导致 JVMTI 开始工作。

所以,问题是:我在任何搜索过程中都没有发现任何迹象表明JVMTI代理与调试不兼容。有人可以解释一下发生了什么,以及为什么JVMTI + JDWP不是一个有效的设置吗?


答案 1

到目前为止,没有一个答案是正确的,如果你查询提到的错误,这是Google上出现的第一个命中,所以我觉得需要一些澄清。

JVMTI和JDWP确实可以一起工作,实际上它们通常必须一起使用。您将在命令行上多次指定(和/或可能)。要解决此问题,请确保您的命令行中只有其中一个或命令行中。ERROR: JDWP unable to get necessary JVMTI capabilities-Xrunjdwp-agentlib:jdwp-Xrunjdwp-agentlib:jdwp

有关更多详细信息,请继续阅读...

JVMTI(Java Virtual Machine Tool Interface)是JVMDI(Java Virtual Machine Debug Interface)和JVMPI(Java Virtual Machine Profiling Interface)的继承者。它结合了JVMDI和JVMPI的功能,这两者在Java 5中被弃用,在Java 6中被删除了。它是公开 JVM 内部的 API,用于调试和分析。

JDWP(Java Debug Wire Protocol)是一种协议,描述了一种用于传输命令和响应的简单机制。据我所知,这是位于 JVM 外部的调试器与它通信并与 JVMTI 接口的唯一方法。

JDI(Java调试器接口)是一个客户端(调试器端)API,它公开了JVMTI的一些功能,同时或多或少地透明地使用JDWP。

Bob Dobbs的答案中提到的错误涉及误导性的错误消息,以及JVM每次在命令行上指定JDWP时都会尝试加载JDWP一次的事实。它没有在任何地方说明JDWP和JVMTI不能一起使用。

更多信息在这里: https://www.ibm.com/support/knowledgecenter/ssw_ibm_i_74/rzaha/jpdebuga.htm


答案 2

我遇到了和你一样的问题,但是我想出了一个JVM错误报告(http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6354345),对这个问题提出了一些启示。它基本上归结为Java代理库,而不是打算在同一VM中加载两次。很糟糕,但似乎这是代理系统的基本限制,你不能同时做这两件事。