btraceio / btrace

BTrace - a safe, dynamic tracing tool for the Java platform
5.8k stars 960 forks source link

VerifyError: Bad type on operand stack #644

Closed magicwerk closed 1 year ago

magicwerk commented 1 year ago

I was playing with the HistoOnEvent example and modified it slightly as shown below. If I specify another class, e.g. EqualsBuilder, it fails with a VerifyError. I can make it run without VerifyError, if I comment out the line with "incrementAndGet()" (but then the logic is broken).

Trace:

@BTrace
public class HistoOnEvent {

    private static Map<String, AtomicInteger> histo = newHashMap();

    // WORKS
    //@OnMethod(clazz = "javax.swing.JComponent", method = "<init>")
    // FAILS
    @OnMethod(clazz = "org.apache.commons.lang3.builder.EqualsBuilder", method = "<init>")
    public static void onMethod(@Self Object obj) {
        String cn = name(classOf(obj));
        AtomicInteger ai = get(histo, cn);
        if (ai == null) {
            ai = newAtomicInteger(1);
            put(histo, cn, ai);
        } else {
            incrementAndGet(ai);    // WORKS if commented out
        }
    }

    @OnTimer(1000)
    public static void print() {
        printNumberMap("Component Histogram", histo);
    }
}

Output:

Exception in thread "Thread-6" Exception in thread "Thread-7" java.lang.VerifyError: Bad type on operand stack
Exception Details:
  Location:
    org/apache/commons/lang3/builder/EqualsBuilder.$btrace$org$openjdk$btrace$runtime$auxiliary$HistoOnEventBtrace$onMethod(Ljava/lang/Object;)V @48: invokestatic
  Reason:
    Type 'java/lang/Object' (current frame, stack[0]) is not assignable to 'java/util/concurrent/atomic/AtomicInteger'
  Current Frame:
    bci: @48
    flags: { }
    locals: { 'java/lang/Object', 'java/lang/String', 'java/lang/Object' }
    stack: { 'java/lang/Object' }
  Bytecode:
    0x0000000: b201 a6b8 01ac 9a00 04b1 2ab8 01b2 b801
    0x0000010: b64c b201 ba2b b801 bd4d 2cc7 0014 04b8
    0x0000020: 01c1 4db2 01ba 2b2c b801 c557 a700 082c
    0x0000030: b801 c957 b201 a6b6 01ce b1b2 01a6 5a5f
    0x0000040: b601 d2b2 01a6 b601 ceb1               
  Exception Handler Table:
    bci [10, 59] => handler: 59
  Stackmap Table:
    same_frame(@10)
    append_frame(@47,Object[#24],Object[#105])
    same_frame(@52)
    full_frame(@59,{Object[#105]},{Object[#201]})

    at eval.btrace.alloc.TracedApp.step(TracedApp.java:52)
    at eval.btrace.alloc.TracedApp.doRun(TracedApp.java:33)
    at eval.btrace.alloc.TracedApp.lambda$1(TracedApp.java:27)
    at java.lang.Thread.run(Thread.java:748)
java.lang.VerifyError: Bad type on operand stack
Exception Details:
  Location:
    org/apache/commons/lang3/builder/EqualsBuilder.$btrace$org$openjdk$btrace$runtime$auxiliary$HistoOnEventBtrace$onMethod(Ljava/lang/Object;)V @48: invokestatic
  Reason:
    Type 'java/lang/Object' (current frame, stack[0]) is not assignable to 'java/util/concurrent/atomic/AtomicInteger'
  Current Frame:
    bci: @48
    flags: { }
    locals: { 'java/lang/Object', 'java/lang/String', 'java/lang/Object' }
    stack: { 'java/lang/Object' }
  Bytecode:
    0x0000000: b201 a6b8 01ac 9a00 04b1 2ab8 01b2 b801
    0x0000010: b64c b201 ba2b b801 bd4d 2cc7 0014 04b8
    0x0000020: 01c1 4db2 01ba 2b2c b801 c557 a700 082c
    0x0000030: b801 c957 b201 a6b6 01ce b1b2 01a6 5a5f
    0x0000040: b601 d2b2 01a6 b601 ceb1               
  Exception Handler Table:
    bci [10, 59] => handler: 59
  Stackmap Table:
    same_frame(@10)
    append_frame(@47,Object[#24],Object[#105])
    same_frame(@52)
    full_frame(@59,{Object[#105]},{Object[#201]})

    at eval.btrace.alloc.TracedApp.step(TracedApp.java:52)
    at eval.btrace.alloc.TracedApp.doRun(TracedApp.java:33)
    at eval.btrace.alloc.TracedApp.lambda$0(TracedApp.java:26)
    at java.lang.Thread.run(Thread.java:748)
jbachorik commented 1 year ago

Is this a trunk or a released version? Could you create the debug class dump - either by providing dumpClasses=true,dumpDir=<path> to the agent arguments or by using btrace -d <path> ... and attach the zipped directory here?

magicwerk commented 1 year ago

git show -s commit 792166d035db952cf2bb6e76cc66fb3f433b234c (HEAD -> develop, origin/develop, origin/HEAD) Author: Jaroslav Bachorik j.bachorik@btrace.io Date: Sat Aug 5 20:35:07 2023 +0200 Shade full jctools

dump.zip