byte-buddy icon indicating copy to clipboard operation
byte-buddy copied to clipboard

Java agent Advice Demo using problem

Open xiangtianyu opened this issue 2 years ago • 2 comments

I wrote a demo for java agent

public class AgentStarter {
    public static void agentmain(String agentArgs, Instrumentation inst) {
        System.out.println("agent main");
    }

    public static void premain(String agentArgs, Instrumentation inst) {
        System.out.println("premain");
        ByteBuddyInstaller.install(inst);
    }
}
public class ByteBuddyInstaller {
    public static void install(Instrumentation inst) {
        new AgentBuilder.Default()
                .type(ElementMatchers.named("org.example.AgentTest"))
                .transform((builder, type, classLoader, module, pd)
                        -> builder.visit(Advice.to(ByteBuddyInstaller.TimeAdvice.class).on(ElementMatchers.named("test"))))
                .installOn(inst);
    }

    public static class TimeAdvice {
        @Advice.OnMethodEnter(suppress = Throwable.class)
        public static void enter() {
            System.out.println("enter");
            long startTime = System.currentTimeMillis();
        }

        @Advice.OnMethodExit(onThrowable = Throwable.class)
        public static void exit(@Advice.Enter long startTime) {
            long endTime = System.currentTimeMillis();
            long executionTime = endTime - startTime;
            System.out.println("Execution Time: " + executionTime + " ms");
        }
    }
}

if i use the jar to start it will report exception:

Caused by: java.lang.ClassNotFoundException: net.bytebuddy.matcher.ElementMatcher
	at java.net.URLClassLoader.findClass(URLClassLoader.java:387)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
	... 7 more

If i use the ide to start, it will not report exception but it will only output "premain" and no other logs.

xiangtianyu avatar Sep 15 '23 06:09 xiangtianyu

Did you include Byte Buddy in your jar? The agent needs to pack all of its dependencies.

raphw avatar Sep 21 '23 02:09 raphw

I solved it by using "inst.appendToBootstrapClassLoaderSearch", maybe it's caused by classloader?

xiangtianyu avatar Sep 21 '23 02:09 xiangtianyu