问题标签 [attach-api]

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 投票
3 回答
4701 浏览

java - 使用附加 API 时出错

在 Eclipse 中使用附加 API 时,控制台中会抛出错误。

为了使用附加 API,我在 eclipse 中安装了 JRE,然后使用编辑选项将 tools.jar 包含在当前 JRE 的外部 jars 选项中。

但是当我尝试执行一个简单的程序时,它会抛出以下错误,例如

java.lang.UnsatisfiedLinkError:在 java.library.path com.sun.tools.attach.AttachNotSupportedException 中没有附加:在 dynamicLoadingTest.VMAttach 的 com.sun.tools.attach.VirtualMachine.attach(VirtualMachine.java:190) 处没有安装提供程序.main(VMAttach.java:17)

这是执行的简单程序。导入 java.io.IOException;

提到的进程 id 6832是系统上运行的 Java 应用程序

在将安装的 jre 更改为 jdk 时,会产生以下错误

0 投票
0 回答
634 浏览

java - 如何将 Java 代理附加到已运行的 VM 实例

我正在尝试使用附加 API 将Java 代理附加到正在运行的Java实例。我遇到的问题是,当我在 Windows 任务管理器中检查已经运行的 Java 进程的进程 ID 并将其硬编码到附加 Java 代理的程序中时。什么都没发生。是不是因为我们不能将 Java 代理附加到已经运行的进程。

我浏览了动态代理加载教程,它工作正常,但我看到的唯一问题是,它检测到VM实例并将Java 代理动态附加到它。这个实例正是正在启动当前程序的实例。

这里的要求是像JMonitor和其他分析工具一样,将 Java 代理附加到已经运行的VM实例。如何进行,请提供一些方向。

0 投票
1 回答
258 浏览

java - 应用程序无法加载附加库 DLL

我在 java 中进行字节码操作,但它是在外部运行的 JAR 文件上完成的。出于这个原因,我正在使用附加 API。

我当前的问题是附加 API 无法加载我在单独文件夹中的 DLL。我以前遇到过文件位置问题,但我修复了这些问题,所以我知道它可以看到文件,只是无法加载它。

我的堆栈跟踪如下:

这是我的源代码:

0 投票
1 回答
820 浏览

java - 使用 Byte Buddy 检测运行 SpringBoot 应用程序时出现 IncompatibleClassChangeError

我想向我的公司介绍 Byte Buddy,我已经为我的同事准备了一个演示。由于我们经常使用 Spring,我认为最好的例子是 SpringBoot 应用程序的检测。我决定将日志添加到 RestController 方法。

Instrumented 应用程序是一个简单的 SpringBoot Hello World 示例:

这是我的 Byte Buddy 代理:

拦截器记录方法执行:

当使用 -javaagent 参数执行时,此示例运行良好。但是,当我尝试使用 Attach API 在正在运行的 JVM 上加载代理时:

我在第一次记录尝试时遇到以下异常:

我使用 Java8 在 64 位 HotSpot 上运行示例:

字节好友版本是 1.4.32。这是代理 Maven 配置:

这是检测应用程序的 pom 文件:

从我的角度来看,在正在运行的服务器上添加日志是非常有价值的选择,我讨厌放弃这部分演示。我尝试尝试不同的重新定义策略,但直到现在似乎没有任何效果。

0 投票
0 回答
456 浏览

java - 在java中使用attach api连接到远程服务器

当我尝试使用附加 api 时出现错误

我正在连接 VirtualMachine vmRemote = VirtualMachine.attach("rmi://<processid>@<server_name>:1099"); 我的桌​​面是基于 Windows 的,远程服务器是 linux。当我发现 tools.jar 只包含 sun.tools.attach.WindowsAttachProvider 可能会导致这个问题?在连接期间,我可以在 jstatd 日志中看到

0 投票
1 回答
1092 浏览

java - 在 Java 9 中以编程方式连接到 JMX 代理

我需要使用 Attach API(如果需要,在运行时加载代理)以编程方式连接到 JMX 代理,如此处的示例所示。这在 Java 8 中运行良好,但在 Java 9 中不起作用,因为 lib 文件夹中不再存在 management-agent.jar:

您能否建议在 Java 9 中执行此操作的正确方法是什么?

提前致谢, 瓦迪姆

0 投票
1 回答
338 浏览

instrumentation - Java - bytebuddy 代理是否能够“完全”重新定义一个类?

字节伙伴代理是否能够克服附加 API 限制,例如“新方法定义”、“静态变量更改”?我可以看到redefineClasses正在从 Agent Builder 调用该方法,但不确定这是否也遵循与附加 API 相同的限制。

我试图了解我是否可以执行以下操作:

1) 使用应用程序类加载器加载代理 jar,例如ParallelWebappClassLoader。我的应用程序是一个 servlet webapp,在运行时它使用上面的类加载器来加载所有应用程序类。

2) 完全重新定义我的类,即任何方法添加/更新和静态/局部变量更改/更新/添加。

我确实有一个当前在附加 API 限制范围内工作的代理,但我正在努力将类加载从系统类加载器委托给应用程序。

非常感谢,

0 投票
0 回答
246 浏览

java - Java WebStart java.lang.NullPointerException at java.awt.Window.getWindows

我目前正在使用 Java Attach API附加到 java webstart 应用程序(来自这里的任何内容: https ://docs.oracle.com/javase/tutorial/uiswing/examples/misc/index.html#security)。

这工作没有问题,但现在我想迭代所有可用的框架使用

但这导致

也许我在这里遗漏了一些东西,但不应该可以访问小程序中的所有框架吗?此方法适用于非小程序应用程序。

问题是错误是在java代码中抛出的,所以我无法避免或处理这个空指针,而且我没有得到任何帧。

提前致谢。

0 投票
1 回答
668 浏览

java - 在 OpenJDK 上运行时加载 java 代理?

我找到了许多指向我的答案VirtualMachine#loadAgent,这真的很棒,除了我在任何地方都没有 VirtualMachine 课程。我也对此感到很困惑,但是我似乎没有任何 Attach API。我正在使用 OpenJDK 8:

还有哪些其他方法可以加载 Java 代理?我正在工作的环境在传递-javaagent:参数方面几乎没有成功,因为它意味着在运行时被注入到类路径中,显然任何普通用户都不想/有知识来手动更改 JVM 参数对于我的具体程序。

另一方面,为了确保这个类是 OpenJDK 的一部分,因为它不仅仅是为 java 热点 VM 设计的,我从http://hg.openjdk.java.net/下载了 OpenJDK 代码,并找到了 VirtualMachine.java 文件,这意味着它肯定是存在的

0 投票
2 回答
185 浏览

java - 加载位于加载器内的 Java 代理 JAR

我的 IDE 中有两个单独的项目,分别用于代理和用于查找目标 VM 并加载代理 JAR 的加载程序。

  • 构建代理项目时,生成的代理 JAR 工件被复制到加载器的资源文件夹中。
  • 构建加载器项目时,加载器 JAR 包含加载器代码和其中的代码agent.jar

生成的可运行加载器结构如下所示:

根据VirtualMachine#loadAgent(java.lang.String)规范,我需要提供包含代理作为第一个参数的 JAR 的路径。

但是,使用时Main.class.getResource("/agent.jar").getPath()我得到一个AgentLoadException: Agent JAR not found or no Agent-Class attribute. 这样做的正确方法是什么?