问题标签 [java-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.
java - JVMTI 与附加的 vm 通信
我有一个使用 Java Attach API 附加的本机 JVMTI 代理。代理基本上只是运行Agent_OnAttach
然后存在。我想将信息从代理传递到附加代理的虚拟机。即使只是写入附加代理的 VM 的标准输出也可以。我知道我可以使用诸如套接字或命名管道之类的带外方式,但我正在寻找内置的东西。
java - Java Attach API 使用什么进程间通信机制?
我试图找出Java Attach API在主要操作系统上使用的进程间通信机制,但我似乎找不到对底层机制的太多参考。
我发现的唯一提及是在这里它指的是 Sun 前段时间开发的 DOORS 进程间通信机制。但我怀疑这是否用于 Windows 或 Mac。大多数文章都描述了 Java Attach API 以及如何加载共享库/DLL,但没有说明 jvisualvm 和本地 JVM 进程之间的通信实际上是如何工作的。
这里提到tools.jar
和libattach.so
(在 Unix 系统上)或attach.dll
(在 Windows 上)负责支持 Attach API,但我找不到关于它们如何在内部工作的详细信息。
那么 Java Attach API 的进程间通信是如何在各个主流操作系统上工作的呢?也就是说,Windows、Mac OSX 和 Linux。
java - 应用程序无法加载附加库 DLL
我在 java 中进行字节码操作,但它是在外部运行的 JAR 文件上完成的。出于这个原因,我正在使用附加 API。
我当前的问题是附加 API 无法加载我在单独文件夹中的 DLL。我以前遇到过文件位置问题,但我修复了这些问题,所以我知道它可以看到文件,只是无法加载它。
我的堆栈跟踪如下:
这是我的源代码:
java - 使用 Open JDK 10.0.2 时,VirtualMachine attach 抛出 com.sun.tools.attach.AgentLoadException: 0
我在使用com.sun.tools.attach.VirtualMachine
Java API 时遇到问题。我的目标应用程序(Tomcat)正在使用 Oracle Hot Spot 版本 1.7.0_80 运行。我正在尝试通过动态附加从另一个使用 Open JDK 10.0.2 的 Java 程序(在同一台机器上)连接该 tomcat。我正在使用下面的代码
我能够成功附加到目标应用程序,但附加后在我的附加程序(运行打开的 JDK 10.0.2)中出现以下异常。
第 582 行的代码是virtualMachine.loadAgent(agentPath, sb.toString());
.
如果我使用 Java 7 或 8 运行我的附加程序,没有例外并且附加成功。
为什么com.sun.tools.attach.AgentLoadException: 0
在使用 JDK 10 时会出现异常?
java - 转换类没有效果
根据本教程,我尝试让 java 代理工作。 https://www.baeldung.com/java-instrumentation#loading-a-java-agent
我确实知道[Agent] Transforming class TestApplication
我没有错误,但我看不到转换类的任何效果。
最终我想让静态负载和动态负载都工作,但现在我专注于静态方式。
我启动:
java -javaagent:static_agent.jar="doeke.application.TestApplication;test" -jar application.jar
如果有帮助,该项目在这里: https ://github.com/clankill3r/java_agent
编辑:
在我现在使用的文件末尾附近的 Transformer.java 中e.printStackTrace();
。
我收到以下错误:
[代理] 转换类 TestApplication javassist.NotFoundException: doeke.application.TestApplication at javassist.ClassPool.get(ClassPool.java:436) at doeke.transformer.Transformer.transform(Transformer.java:48) at java.instrument/java。 lang.instrument.ClassFileTransformer.transform(ClassFileTransformer.java:246) 在 java.instrument/sun.instrument.TransformerManager.transform(TransformerManager.java:188) 在 java.instrument/sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java: 563) 在 java.instrument/sun.instrument.InstrumentationImpl.retransformClasses0(Native Method) 在 java.instrument/sun.instrument.InstrumentationImpl.retransformClasses(InstrumentationImpl.java:167) 在 doeke.static_agent.Static_Agent.transform(Static_Agent.java: 56) 在 doeke.static_agent.Static_Agent。在 java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 java.base/jdk.internal 的 doeke.static_agent.Static_Agent.premain(Static_Agent.java:22) 的 transformClass(Static_Agent.java:34)。 reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.base/java.lang.reflect.Method.invoke(Method. java:566) 在 java.instrument/sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:513) 在 java.instrument/sun.instrument.InstrumentationImpl.loadClassAndCallPremain(InstrumentationImpl.java:525)在 java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.base/jdk.internal.reflect.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 的 invoke0(Native Method)。 base/java.lang.reflect.Method.invoke(Method.java:566) at java.instrument/sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:513) at java.instrument/sun.instrument.InstrumentationImpl.loadClassAndCallPremain( InstrumentationImpl.java:525)在 java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 的 invoke0(Native Method)。 base/java.lang.reflect.Method.invoke(Method.java:566) at java.instrument/sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:513) at java.instrument/sun.instrument.InstrumentationImpl.loadClassAndCallPremain( InstrumentationImpl.java:525)仪器/sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:513) 在 java.instrument/sun.instrument.InstrumentationImpl.loadClassAndCallPremain(InstrumentationImpl.java:525)仪器/sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:513) 在 java.instrument/sun.instrument.InstrumentationImpl.loadClassAndCallPremain(InstrumentationImpl.java:525)
- - 开始 - -
0
1
java - 在 Java Applet (jp2launcher) 上启动 Java 代理
我想在 jp2launcher 上运行的 Java 小程序上启动 Java 代理。我设法使用这个jattach工具附加到 jp2launcher.exe,我可以检查我的代理 .jar 文件是否已加载,但我的 preMain 或 agentMain 都没有被调用。
当我使用 com.sun.tools.attach.VirtualMachine 附加到进程以附加到 jp2launcher.exe 并以这种方式加载代理时,会发生相同的行为。
我已成功使用上述方法在普通 Java 应用程序上启动代理。
任何想法为什么会发生这种情况以及是否可以在小程序上启动 Java 代理?
编辑:
这似乎是一个导致代理加载失败的安全问题。还没有通过使用 jattach 或 tools.attach 来加载代理,但是通过使用 JAVA_TOOL_OPTIONS 环境变量来做到这一点。
包含file.policy
:
java - 通过从 Java 代理运行的反射获取 SWT 类
我开发了一个 Java 代理,它使用 Attach API 附加到 Eclipse。我想使用反射,这样我就可以获取 UI 线程并调度一些调用。问题是我无法通过反射获得 org.eclipse.swt.Display 类。我得到了 ClassNotFoundException。任何想法为什么会发生这种情况以及在这种情况下如何成功使用反射?