我花了最后4个小时来尝试设置Eclipse TPTP内存
对必须远程运行的Tomcat实例进行性能分析(即不在
eclipse )。根据TPTP和Agent,这应该是可能的
Controller 文档。

我在Eclipse(Galileo)中安装了TPTP组件(4.6.0)
工作台,以及根据
网站上的说明。为了启用代理,我添加了
用于启动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和各种版本的代理 Controller 。

最后,问题出在我启动了Tomcat
带有“jpda”选项,catalina.bat转换为
-Xdebug -Xrunjdwp:transport=.....

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

因此,问题是:在搜索以下内容时,我一无所获
指示JVMTI代理与调试不兼容。能够
有人解释发生了什么以及为什么JVMTI + JDWP不是有效的
建立?

最佳答案

到目前为止,没有一个答案是正确的,如果您查询提到的错误,这是Google上的第一个匹配项,因此我认为需要进行澄清。

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

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

JVMTI(Java虚拟机工具接口(interface))是JVMDI(Java虚拟机调试接口(interface))和JVMPI(Java虚拟机概要分析接口(interface))的后继产品。它合并了JVMDI和JVMPI的功能,这两个功能在Java 5中已弃用,而在Java 6中已删除。这是API,它公开了JVM内部以进行调试和配置。

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

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

鲍勃·多布斯(Bob Dobbs)的答案中提到的bug与误导性错误消息有关,并且JVM在每次在命令行上指定JDWP时都会尝试加载一次。它没有声明JDWP和JVMTI不能一起使用。

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

10-06 04:59