Skip to content

TTL Agent instrument the class exception #634

@steverao

Description

@steverao

We encountered a problem by using TTL Agent recently. The phenomenon is as follows:
When my application use TTL Agent and other Java Agent together, it will be blocked.
The starting log of my application is as follows:

 TtlTransformer: Fail to transform class jdk/jfr/internal/instrument/ThrowableTracer, cause: java.lang.StackOverflowError
java.lang.StackOverflowError
        at java.base/java.lang.LinkageError.<init>(LinkageError.java:55)
        at java.base/java.lang.ClassCircularityError.<init>(ClassCircularityError.java:53)
        at java.base/java.lang.Throwable.<init>(Throwable.java:272)
        at java.base/java.lang.Error.<init>(Error.java:70)
        at java.base/java.lang.LinkageError.<init>(LinkageError.java:55)
        at java.base/java.lang.ClassCircularityError.<init>(ClassCircularityError.java:53)
        at java.base/java.lang.Throwable.<init>(Throwable.java:272)
        at java.base/java.lang.Error.<init>(Error.java:70)
        at java.base/java.lang.LinkageError.<init>(LinkageError.java:55)
        at java.base/java.lang.ClassCircularityError.<init>(ClassCircularityError.java:53)
        at java.base/java.lang.Throwable.<init>(Throwable.java:272)
        at java.base/java.lang.Error.<init>(Error.java:70)
......

Then, I get jstack about my application process and found below information:

"agent-init-thread" #12 prio=5 os_prio=0 cpu=2608.86ms elapsed=31.78s tid=0x00007f91203ff800 nid=0xef runnable  [0x00007f90f88bd000]
   java.lang.Thread.State: RUNNABLE
        at java.io.FileOutputStream.writeByexittes(java.base@11.0.15.1/Native Method)
        at java.io.FileOutputStream.write(java.base@11.0.15.1/FileOutputStream.java:354)
        at java.io.BufferedOutputStream.flushBuffer(java.base@11.0.15.1/BufferedOutputStream.java:81)
        at java.io.BufferedOutputStream.flush(java.base@11.0.15.1/BufferedOutputStream.java:142)
        - locked <0x00000000e0048db8> (a java.io.BufferedOutputStream)
        at java.io.PrintStream.write(java.base@11.0.15.1/PrintStream.java:561)
        - locked <0x00000000e0048d90> (a java.io.PrintStream)
        at sun.nio.cs.StreamEncoder.writeBytes(java.base@11.0.15.1/StreamEncoder.java:233)
        at sun.nio.cs.StreamEncoder.implFlushBuffer(java.base@11.0.15.1/StreamEncoder.java:312)
        at sun.nio.cs.StreamEncoder.flushBuffer(java.base@11.0.15.1/StreamEncoder.java:104)
        - locked <0x00000000e0048f10> (a java.io.OutputStreamWriter)
        at java.io.OutputStreamWriter.flushBuffer(java.base@11.0.15.1/OutputStreamWriter.java:181)
        at java.io.PrintStream.write(java.base@11.0.15.1/PrintStream.java:606)
        - locked <0x00000000e0048d90> (a java.io.PrintStream)
        at java.io.PrintStream.print(java.base@11.0.15.1/PrintStream.java:745)
        at java.io.PrintStream.println(java.base@11.0.15.1/PrintStream.java:899)
        - locked <0x00000000e0048d90> (a java.io.PrintStream)
        at java.lang.Throwable$WrappedPrintStream.println(java.base@11.0.15.1/Throwable.java:752)
        at java.lang.Throwable.printStackTrace(java.base@11.0.15.1/Throwable.java:662)
        - locked <0x00000000e0048d90> (a java.io.PrintStream)
        at java.lang.Throwable.printStackTrace(java.base@11.0.15.1/Throwable.java:648)
        at java.lang.Throwable.printStackTrace(java.base@11.0.15.1/Throwable.java:639)
        at com.alibaba.ttl.threadpool.agent.internal.logging.Logger$StdErrorLogger.log(Logger.java:70)
        at com.alibaba.ttl.threadpool.agent.TtlTransformer.transform(TtlTransformer.java:67)
        at java.lang.instrument.ClassFileTransformer.transform(java.instrument@11.0.15.1/ClassFileTransformer.java:246)
        at sun.instrument.TransformerManager.transform(java.instrument@11.0.15.1/TransformerManager.java:188)
        at sun.instrument.InstrumentationImpl.transform(java.instrument@11.0.15.1/InstrumentationImpl.java:563)
        at java.lang.Throwable.<init>(java.base@11.0.15.1/Throwable.java:272)
        at java.lang.Error.<init>(java.base@11.0.15.1/Error.java:70)
        at java.lang.LinkageError.<init>(java.base@11.0.15.1/LinkageError.java:55)
        at java.lang.IncompatibleClassChangeError.<init>(java.base@11.0.15.1/IncompatibleClassChangeError.java:55)
        at java.lang.NoSuchMethodError.<init>(java.base@11.0.15.1/NoSuchMethodError.java:58)
        at java.lang.invoke.MethodHandleNatives.resolve(java.base@11.0.15.1/Native Method)
        at java.lang.invoke.MemberName$Factory.resolve(java.base@11.0.15.1/MemberName.java:1070)
        at java.lang.invoke.MemberName$Factory.resolveOrNull(java.base@11.0.15.1/MemberName.java:1113)
        at java.lang.invoke.InvokerBytecodeGenerator.resolveFrom(java.base@11.0.15.1/InvokerBytecodeGenerator.java:625)
        at java.lang.invoke.InvokerBytecodeGenerator.lookupPregenerated(java.base@11.0.15.1/InvokerBytecodeGenerator.java:680)
        at java.lang.invoke.InvokerBytecodeGenerator.generateCustomizedCode(java.base@11.0.15.1/InvokerBytecodeGenerator.java:689)
        at java.lang.invoke.LambdaForm.compileToBytecode(java.base@11.0.15.1/LambdaForm.java:871)
        at java.lang.invoke.DirectMethodHandle.makePreparedLambdaForm(java.base@11.0.15.1/DirectMethodHandle.java:287)
        at java.lang.invoke.DirectMethodHandle.preparedLambdaForm(java.base@11.0.15.1/DirectMethodHandle.java:216)
        at java.lang.invoke.DirectMethodHandle.preparedLambdaForm(java.base@11.0.15.1/DirectMethodHandle.java:201)
        at java.lang.invoke.DirectMethodHandle.make(java.base@11.0.15.1/DirectMethodHandle.java:94)
        at java.lang.invoke.MethodHandles$Lookup.getDirectMethodCommon(java.base@11.0.15.1/MethodHandles.java:2322)
        at java.lang.invoke.MethodHandles$Lookup.getDirectMethodNoSecurityManager(java.base@11.0.15.1/MethodHandles.java:2278)
        at java.lang.invoke.MethodHandles$Lookup.getDirectMethodForConstant(java.base@11.0.15.1/MethodHandles.java:2520)
        at java.lang.invoke.MethodHandles$Lookup.linkMethodHandleConstant(java.base@11.0.15.1/MethodHandles.java:2466)
        at java.lang.invoke.MethodHandleNatives.linkMethodHandleConstant(java.base@11.0.15.1/MethodHandleNatives.java:592)
        at jdk.jfr.internal.PlatformRecorder.startDiskMonitor(jdk.jfr@11.0.15.1/PlatformRecorder.java:386)
        at jdk.jfr.internal.PlatformRecorder.<init>(jdk.jfr@11.0.15.1/PlatformRecorder.java:83)
        at jdk.jfr.FlightRecorder.getFlightRecorder(jdk.jfr@11.0.15.1/FlightRecorder.java:182)
        - locked <0x00000000e3e801b0> (a java.lang.Class for jdk.jfr.internal.PlatformRecorder)
        at jdk.jfr.Recording.<init>(jdk.jfr@11.0.15.1/Recording.java:97)
        at jdk.jfr.Recording.<init>(jdk.jfr@11.0.15.1/Recording.java:121)
        at com.alibaba.cpc.jfr.JFRContinuousProfileRecorder.init(JFRContinuousProfileRecorder.java:45)
......

at com.alibaba.cpc.jfr.JFRContinuousProfileRecorder.init(JFRContinuousProfileRecorder.java:45)
is the code from our Java Agent. It seems our Java Agent use jdk.jfr.* class and then TTL Agent transformed them failed and cause relevant thread print a lot of logs and can't stop.

Is there any way to exclude some package that TTL don't transform? Thank you very much!

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions