【问题标题】:Java JVMTI doesn't work alongside -Xdebug -XrunjdwpJava JVMTI 不能与 -Xdebug -Xrunjdwp 一起使用
【发布时间】:2010-12-06 11:40:01
【问题描述】:

我花了 4 个小时尝试设置 Eclipse TPTP 内存 在必须远程运行的 Tomcat 实例上进行分析(即不在 蚀)。根据 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 和各种版本的代理控制器。

最后问题竟然是我在启动Tomcat 带有“jpda”选项,catalina.bat 将其翻译成

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

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

所以,问题是:在我的任何搜索过程中,我什么也没找到 表示 JVMTI 代理与调试不兼容。能 有人解释发生了什么以及为什么 JVMTI + JDWP 无效 设置?

【问题讨论】:

    标签: java debugging jvmti jdwp


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      JVMTI 和 JDWP do 一起工作,实际上它们通常必须一起使用。如果在命令行上多次指定-Xrunjdwp(和/或可能-agentlib:jdwp),您将获得ERROR: JDWP unable to get necessary JVMTI capabilities。要修复它,请确保您的命令行中只有 -Xrunjdwp-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 的回答中提到的bug 涉及误导性错误消息,以及 JVM 每次在命令行上指定时都会尝试加载 JDWP 一次这一事实。它没有说明 JDWP 和 JVMTI 不能一起使用。

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

      【讨论】:

      • 那么,是否可以同时使用远程调试和分析?
      • @michael 我相信是这样,但除非您试图模仿一些奇怪的情况以试图重现内存泄漏或巨大的 CPU 峰值,否则在调试时进行分析不是一个坏主意吗?
      • 很好的答案。收到此错误。我必须先禁用我古老的 Sun App Server 上的调试模式,然后才能让 YourKit 分析器配置与它一起工作。谢谢!
      • @michaelnesterenko 实际上答案是“视情况而定”。这取决于分析代理从 jvmti 请求的功能。例如。断点功能可能一次只能由一个环境拥有(并且每个代理都有自己的环境); docs.oracle.com/javase/7/docs/platform/jvmti/… 。因此,如果探查器代理需要设置断点的功能,您的调试器代理将无法获得它们(或相反)。这意味着每当您遇到此类错误时,您都无能为力,在这种情况下您将无法进行调试。
      【解决方案3】:

      对我来说,这与 Code Bling 发布的问题相同,它们是重复的 -Xrunjdwp 并没有意识到还有第二个 -Xrunjdwp,因为它隐藏在变量 %JAVA_OPTIONS% 中,请检查您的应用程序服务器启动脚本。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-12-19
        • 2020-10-03
        • 1970-01-01
        • 1970-01-01
        • 2018-06-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多