问题标签 [jvmti]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
445 浏览

java - 使用jpda连接weblogic

我正在构建一个实用程序/工具来分析/跟踪部署在 Weblogic 10 (java 6) 中的 Java EE 应用程序中的方法调用。目的是快速了解我们庞大的企业应用程序中的事件流。(浏览代码很乏味)

我已经按照与 jdk6 捆绑的“Trace”演示应用程序来构建我的版本。该应用程序在连接到普通桌面样式应用程序并成功跟踪方法调用时工作正常。但是对于 Weblogic,EventQueue.remove 返回 null EventSet。请注意,与 weblogic VM 的连接是成功的。但是一旦连接上,部署的 Web 应用程序中的任何点击或活动都会导致目标 VM 中的线程挂起,最终导致 http 请求超时。

我正在为 weblogic 启动脚本使用以下 vm 参数:

使用的示例代码来自 jdk1.6.0_13\demo\jpda\examples\com\sun\tools\example\trace

有没有人有类似工具的经验或面临类似的问题。想知道Eclipse远程调试是怎么实现的!

谢谢!

0 投票
0 回答
347 浏览

java - jvmti 和 Spring AOP 冲突

背景:我正在做一些加密Java .class 文件,并在加载.class 文件时使用jvmti agentlib 解密源数据。当我为 Java SE 执行此操作时,它正在工作。

但是当我使用 Spring AOP 为 java web 项目执行此操作时会引发一些异常。

.class 文件可以被读取ContextLoaderListener,当然它是加密的,但是为什么 AOP 不使用 jvmti agentlib 加载它呢?

似乎 Spring AOP 在没有 jvmti agentlib 的情况下加载 .class 文件

jvmti和AOP之间有什么关系吗?我想更多地了解这个问题。

0 投票
1 回答
219 浏览

java - 使用 JVMTI 计算 CPU 使用率

我正在寻找我的 java 应用程序的 CPU 使用率。我发现获得 CPU 使用率的最佳方法是 (process_time/elapsed_time)*100.0。对于 java 应用程序,process_time 由 com.sun.management.OperatingSystemMXBean 获取。有没有办法使用 JVMTI 计算 CPU 使用率。

0 投票
1 回答
2815 浏览

java - Java 附加 API:UnsatisfiedLinkError

使用 时Java Attach API,我仅在Linux上收到以下链接错误(在不同的机器上尝试过):

有趣的是,在Solaris 和 Windows 上,它开箱即用。

我尝试了几种指定java.library.path指向包含libattach.so但没有运气的目录的组合。

这里有什么问题?

还有一个额外的问题
有没有办法查看哪个本机库实际上绑定到了 java 类?

0 投票
2 回答
909 浏览

java - Java 字节码检测:对 defineClass 的反射调用中的 NullPointerException

意图

我正在使用java.lang.instrument包为 Java 程序创建一些工具。这个想法是我通过这个系统使用字节码操作,以便在每个方法的开头和结尾添加方法调用。一般来说,修改后的 Java 方法如下所示:

MyFancyProfiler是一个相对复杂的系统的入口点,它在premain方法期间被初始化(它是 的一部分java.lang.instrument)。

编辑-包含一个静态 API,它将通过类似于此问题的解决方案中MyFancyProfiler描述的机制获得对系统其余部分的引用。引用以 . 的形式获得,并通过反射进行适当的调用,因此即使当前的 ClassLoader 不知道底层类,它仍然可以工作。Object

困难

对于一个简单的 Java 程序,该方法可以正常工作。对于“真正的”应用程序(如窗口应用程序,尤其是RCP/OSGi应用程序),我遇到了ClassLoaders. 有些ClassLoaders人不知道如何找到这个MyFancyProfiler类,所以当它试图调用MyFancyProfiler.

我对此的解决方案(以及我真正的问题正在发生的地方)目前是通过反射调用“注入”MyFancyProfiler到每个遇到的. 它的要点是:ClassLoaderdefineClass

编辑以获取更多信息- 这种注入的原因是为了确保每个类,无论是哪个 ClassLoader 加载它,都能够MyFancyProfiler.methodEntered直接调用。一旦它进行调用,MyFancyProfiler将需要使用反射与系统的其余部分进行交互,否则当它尝试直接引用时,我将得到一个 InvocationTargetException 或 NoClassDef 异常。我目前正在运行它,因此唯一的“直接”依赖项MyFancyProfiler是 JRE 系统类,所以它似乎很好。

问题

这甚至有效!大多数时候!但是对于我在尝试跟踪 Eclipse(从命令行启动 IDE)时遇到的至少两个单独的 ClassLoader,我NullPointerException从方法内部得到了一个ClassLoader.defineClass

ClassLoader.java的第 500 行是对 的调用domains.add(pd),其中domains似乎是在构造函数时初始化的 Set,并且pdProtectionDomain据我所知)应该是“默认值” ProtectionDomain。所以我看不到这条线导致NullPointerException. 目前我很困惑,我希望有人可以对此提供一些见解。

什么可能导致defineClass以这种方式失败?如果没有明显的解决方案,您能否为我的整体问题提供一种潜在的替代方法?

0 投票
1 回答
396 浏览

heap-memory - jvmti:如何使用 class_tag

我正在查看 JVMTI API(http://docs.oracle.com/javase/6/docs/platform/jvmti/jvmti.html),以便在给定状态下获取当前堆。

为了做到这一点,我想使用 FollowReferences ( http://docs.oracle.com/javase/6/docs/platform/jvmti/jvmti.html#FollowReferences ) 方法,该方法将指向 jvmtiHeapCallbacks 的指针作为参数结构,它定义了几个回调,尤其是堆引用回调。

此回调必须采用以下形式:

我不明白如何使用 class_tag?在 API 中,我找不到将 class_tag 转换为 jclass 的函数。我查看了几个示例,但无法使用 class_tag。

在 API 中,有一个 SetTag 和 GetTag 函数,但它们似乎是针对 jobject 而不是针对 jclass。

0 投票
2 回答
487 浏览

jvmti - 在 Sun JVM 中查找哪些代码分配了大对象

是否有类似Find which methods为 Sun JAVA分配大对象的功能?

或者

0 投票
1 回答
213 浏览

execution-time - 使用 JVMTI 提供的 MethodEntry 和 MethodExit 事件挂钩,我将如何测量在 Java 中执行的方法的时间?

我看到了你的下面的线程。我也在尝试做类似的事情,但不确定哪个 api 会给出最好的结果:你能建议你使用哪一个吗?

使用 JVMTI 提供的 MethodEntry 和 MethodExit 事件挂钩,我将如何测量在 Java 中执行的方法的时间?

简单来说就是:time2 - time1 但我看到的问题是,如何区分不同的方法?有一个methodID,但是递归调用呢?方法打开后什么时候关闭?

我应该比较堆栈跟踪吗?什么是有意义的数据结构来跟踪输入的方法?地图之类的?

0 投票
1 回答
882 浏览

native - JVMTI 本机代理 (DLL) 无法加载到正在运行的 Java 程序 - AgentLoadException

我在这个问题上挣扎了几天,但还没有得到正确的答案。

这里是问题描述:我写了一个普通的Java程序(Program-A),写了一个基于Windows的原生代理(*.dll,用C/C++编写),使用Agent_OnLoad、Agent_OnAttach、Agent_OnUnload方法,如果使用它可以正常工作Java 命令行标志 (-agentlib)。然后我编写了另一个 Java 程序,将本机代理附加到运行 Java Program-A 上(请参阅下面的 VM attach 和 loadAgentPath 代码段),但是我得到了异常:

我试图以这种或那种方式更改agentPath(绝对或相对文件路径),但这些都不起作用。我是否应该尝试其他方法来完成这项工作。我需要将本机代理附加到正在运行的 java 程序上,而不是使用命令行标志。

有谁知道根本原因或解决方案的线索?

顺便说一句,运行附加 VM Java 代码的命令行为:

环境相关信息:
- 操作系统:Windows XP - Java 版本:Java(TM) SE 运行时环境(内部版本 1.7.0-b147)

0 投票
1 回答
1480 浏览

java - java代理在运行时加载jvmti,从内部卸载

我正在编写一个 Java 代理来与 JVMTI 交互。由于我不会进入的原因,我需要使用 JVMTI(java进程内的 C 接口)而不是 Java APIjava.lang.instrument或 JDI。我希望能够做一些似乎不受直接支持的事情。

  1. 有没有办法在 Java 进程已经启动后加载代理?
  2. 有没有办法从 JVMTI 代码内部或进程外部卸载 Java 代理(没有杀死整个 Java 进程)?例如,dlclose()如果我能找到动态加载模块的句柄,我是否可以安全地从 JVMTI 代码调用?

如果无法完成这些操作,有没有办法在加载数据后将数据传递给 Java 代理?是否有通过一些 Java 命令行实用程序执行此操作的正常方法?如果没有,我可以安全地创建一个线程并让它在我的代理代码中使用标准 C 或 C++ 库调用来监听套接字吗?

如果有帮助,请不要担心您的答案是否支持 Windows - 我正在开展这个项目以扩展仅适用于 Unix 的调试工具。

注意:我已经看到了这一点,但认为可能有一些正常的方法可以做到这一点,但 JVMTI 标准中没有。