13

我花了最后 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 不是有效的设置吗?

4

3 回答 3

21

到目前为止,没有一个答案是正确的,如果您查询提到的错误,这是谷歌上出现的第一个问题,所以我觉得需要澄清一下。

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

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

JVMTI(Java 虚拟机工具接口)是 JVMDI(Java 虚拟机调试接口)和 JVMPI(Java 虚拟机分析接口)的继承者。它结合了 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 和 JVMTI 不能一起使用。

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

于 2011-05-17T21:31:16.557 回答
3

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

于 2010-11-08T05:14:31.203 回答
1

对我来说,这与 Code Bling 帖子的问题相同,它们是重复的-Xrunjdwp,没有意识到有第二个-Xrunjdwp,因为它隐藏在变量%JAVA_OPTIONS%中,请检查您的 Application Server 启动脚本。

于 2014-01-22T06:35:22.623 回答