Java JVMTI不能与-Xdebug -Xrunjdwp一起使用

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

我根据网站上的说明将TPTP组件(4.6.0)安装到我的Eclipse(Galileo)工作台以及代理控制器中。 为了启用代理,我在启动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不是有效的设置?

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

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

有关详细信息,请继续阅读……

JVMTI(Java虚拟机工具接口)是JVMDI(Java虚拟机调试接口)和JVMPI(Java虚拟机概要分析接口)的后继者。 它结合了JVMDI和JVMPI的function,这两种function在Java 5中已弃用并在Java 6中删除。它是为了调试和分析而公开JVM内部的API。

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

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

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

更多信息: http : //publib.boulder.ibm.com/infocenter/iseries/v5r4/topic/rzaha/jpdebuga.htm

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

对我而言,它与Code Blingpost相同,它们是重复的-Xrunjdwp没有意识到第二个-Xrunjdwp因为它隐藏在变量%JAVA_OPTIONS% ,请检查您的Application Server启动脚本。