首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何调试使用JVMTI代理设置断点的java应用程序(无法获得必要的JVMTI功能)

如何调试使用JVMTI代理设置断点的java应用程序(无法获得必要的JVMTI功能)
EN

Stack Overflow用户
提问于 2016-06-05 14:29:13
回答 2查看 1.2K关注 0票数 1

我想调试使用我编写的jvmti代理的java应用程序。这似乎只有在jvmti代理不试图启用"can_generate_breakpoint_events“功能时才有效。

尝试启用断点功能并在调试模式下启动应用程序会导致以下错误:

代码语言:javascript
复制
ERROR: JVMTI: 98(Unknown): Unable to get necessary JVMTI capabilities. [..\src\agent.cpp:437]

有任何方法来调试使用jvmti代理设置断点的应用程序吗?

我检查了Java JVMTI doesn't work alongside -Xdebug -Xrunjdwp,但所接受的答案似乎不正确,因为它实际上似乎也依赖于启用的功能。

我知道分析器(如YourKit等)也在使用jvmti代理,并且仍然允许您在调试模式下运行应用程序(嗯,也许它们只是没有使用导致这些冲突的功能)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-24 23:05:29

根据我目前的理解,答案实际上如下。来自JVMTI文档:

每个JVM TI实现的潜在可用功能是不同的。取决于实现,一种能力:

  • ..。
  • 一次只能被一个环境所占有
  • ..。

设置断点和监视点似乎是一种只能由一个环境所拥有的能力类型。

因此,问题是我的代理试图声明can_generate_breakpoint功能,但调试器代理也需要它们。因此,有两个代理请求这些功能,这将导致上述错误。

因此,对我来说,这意味着您无法调试使用JVM TI代理启动的Java应用程序,该代理需要能够设置断点。

我能想到的唯一理论解决方案是,我的JVM TI代理还实现了对JDWP的支持,并允许调试器连接到它(我认为这本身就是一个相当大的项目)。

票数 0
EN

Stack Overflow用户

发布于 2016-10-26 22:13:07

TL;DR

要调试JVM代理,请使用本机代码调试器,例如gdb。

稍微多一点细节

Java应用程序中有两种代码-- Java代码(应用程序本身和基于java.lang.tools的代理)和本机代码( Java类的本机方法、JVMTI代理和VM本身)。要调试前者,需要使用Java调试器(使用JDWP)。要调试后者,您需要像对C/C++程序一样使用常规的本机代码调试器。如果希望同时调试Java和本机代码,则需要同时使用这两个调试器。

关于JVMTI代理、JDWP以及需要什么

JVM可以在多个代理一起运行的情况下启动,每个代理都有自己的JVMTI环境(功能、事件侦听器等)。但是,如果多个代理(或单个代理的多个实例)使用相同的资源,例如相同的全局变量,那么它们可以相互影响(JDK的JDWP代理就是这种情况--这就是为什么最多只能有一个-agentlib:jdwp)。

JDWP是Java调试器的协议。JDWP代理是JDK附带的一个JVMTI代理,它支持JVM中的JDWP协议。它是一个普通的JVMTI代理,可以与其他代理一起启动。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37643025

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档