我知道如何使用java代理启动java程序:
java -javaagent:myAgent.jar MyJavaProgram
Run Code Online (Sandbox Code Playgroud)
但是,如果我想添加2个或更多java代理程序来检测我的程序呢?我不想重新调用java -javaagent:...我必须在JVM中加载每个代理.
我尝试过这样的事情:
java -javaagent:agentA.jar, agentB.jar MyJavaProgram
Run Code Online (Sandbox Code Playgroud)
或类似的东西:
java -javaagent:agentA.jar agentB.jar MyJavaProgram
Run Code Online (Sandbox Code Playgroud)
但没有成功.
有没有解决我的问题的答案?
谢谢.
我想学习一些关于javaagents的东西,但研究并不容易.大多数结果指的是JADE.我知道java代理可能意味着两件事:
我在这里找到了类似的问题,但不幸的是它也提到了版本1.
是否可以在虚拟机启动后从同一个VM中插入javaagent?
让我们说例如我们在jar myagent.jar中有一个代理,它具有适当的元数据设置和已经实现的agentmain方法.现在,用户程序调用API调用,该调用应该导致代理插入,以便它可以重新定义类.
可以这样做吗?
我希望在不停止应用程序的情况下分析Java应用程序.我可以在应用程序运行时以某种方式添加Javaagent吗?
cassandra升级后启动时出现此错误.任何的想法?
# cassandra -f
xss = -ea -javaagent:/usr/share/cassandra/lib/jamm-0.2.5.jar -XX:+UseThreadPriorities
-XX:ThreadPriorityPolicy=42 -Xms1920M -Xmx1920M -Xmn200M -XX:+HeapDumpOnOutOfMemoryError -Xss180k
The stack size specified is too small, Specify at least 228k
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
Run Code Online (Sandbox Code Playgroud) 我有一个类似的问题:前一个问题
我正在使用Netbeans将Java项目转换为Maven.为了启动程序,我们需要的命令行参数之一是-javaagent设置.例如
-javaagent:lib/eclipselink.jar
Run Code Online (Sandbox Code Playgroud)
我正在尝试让Netbeans启动应用程序以供开发使用(我们将编写自定义启动脚本以进行最终部署)
由于我使用Maven来管理Eclipselink依赖项,我可能不知道Eclipselink jar文件的确切文件名.它可能类似于eclipselink-2.1.1.jar,它基于我在pom.xml文件中配置的版本.
如何配置exec-maven-plugin将精确的eclipselink文件名传递给命令行参数?
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<configuration>
<executable>java</executable>
<arguments>
<argument>-Xmx1000m</argument>
<argument>-javaagent:lib/eclipselink.jar</argument> <==== HELP?
<argument>-classpath</argument>
<classpath/>
<argument>my.App</argument>
</arguments>
</configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud) 在我的C++ JNI-Agent项目中,我正在实现一个函数,该函数将被赋予可变数量的参数并将执行传递给另一个函数:
// address of theOriginalFunction
public static void* originalfunc;
void* interceptor(JNIEnv *env, jclass clazz, ...){
// add 4 to the function address to skip "push ebp / mov ebp esp"
asm volatile("jmp *%0;"::"r" (originalfunc+4));
// will not get here anyway
return NULL;
}
Run Code Online (Sandbox Code Playgroud)
上面的函数只需要跳转到:
JNIEXPORT void JNICALL Java_main_Main_theOriginalFunction(JNIEnv *env, jclass clazz, jboolean p1, jbyte p2, jshort p3, jint p4, jlong p5, jfloat p6, jdouble p7, jintArray p8, jbyteArray p9){
// Do something
}
Run Code Online (Sandbox Code Playgroud)
上面的代码工作正常,原始函数可以正确读取所有参数(使用包括数组在内的9种不同类型的参数进行测试).
但是,在从拦截器跳入原始函数之前,我需要做一些计算.但是,在这里我观察到有趣的行为.
void* interceptor(JNIEnv *env, jclass …Run Code Online (Sandbox Code Playgroud) 我正在使用AspectJ来监视字段访问和字段修改.我有一个gradle项目,它编译了两个方面,并使用gradle shadow插件将jar与aspectjrt和aspectjweaver打包在一个带阴影的jar中.代理仍然是org.aspectj.weaver.loadtime.Agent.一切正常,但当我尝试重新定位aspectj包时,我得到一个错误.
shadow插件配置是:
shadowJar {
relocate 'org.aspectj', 'shadow.org.aspectj'
relocate 'aj.org.objectweb.asm', 'shadow.aj.org.objectweb.asm'
}
Run Code Online (Sandbox Code Playgroud)
清单:
jar {
manifest {
attributes("Premain-Class": "shadow.org.aspectj.weaver.loadtime.Agent",
"Can-Redefine-Classes": true,
"Can-Retransform-Classes":true)
}
}
Run Code Online (Sandbox Code Playgroud)
这是反编译的方面类,所以看起来是正确的:
package com.vfunction.singletonanalysis;
import shadow.org.aspectj.lang.JoinPoint;
import shadow.org.aspectj.lang.NoAspectBoundException;
import shadow.org.aspectj.lang.annotation.Aspect;
import shadow.org.aspectj.lang.annotation.Before;
@Aspect
public class StaticFieldBeforeAccessAspect extends AbstractFieldAccessAspect {
public StaticFieldBeforeAccessAspect() {
}
@Before("callAt()")
public void before(JoinPoint joinPoint) throws Throwable {
this.printJoinPoint(joinPoint);
}
public static StaticFieldBeforeAccessAspect aspectOf() {
if (ajc$perSingletonInstance == null) {
throw new NoAspectBoundException("com.vfunction.singletonanalysis.StaticFieldBeforeAccessAspect", ajc$initFailureCause);
} else {
return ajc$perSingletonInstance;
}
}
public static boolean …Run Code Online (Sandbox Code Playgroud) 使用自定义Java代理打包jar文件时,可以添加以下属性:
Can-Redefine-ClassesCan-Retransform-Classes这两者有什么区别?
如果重新定义发生在类加载和重新转换之后,那么何时发生了完全重新转换?
javaagents ×10
java ×6
jvm ×3
stack ×2
arguments ×1
aspectj ×1
c++ ×1
cassandra ×1
maven ×1
ubuntu-14.04 ×1