📄 jvmbytecodesdebug.jrag
字号:
} break; case LOOKUPSWITCH: { int db = ((index + 4) / 4) * 4; // Align-4, step to defaultbytes int val = fourByteToInt(codes, db); db+=4; res = "defaultbytes:" + val; int npairs = fourByteToInt(codes, db); db+=4; res += ", npairs:" + npairs; for(int i = 0; i < npairs; i++) res += "\n\t" + "match:" + fourByteToInt(codes, db + i * 8) + ", offset:" + fourByteToInt(codes, db + i * 8 + 4); } break; case IRETURN: break; case LRETURN: break; case FRETURN: break; case DRETURN: break; case ARETURN: break; case RETURN: break; case GETSTATIC: res = getCharOperand(codes, index+1);break; case PUTSTATIC: res = getCharOperand(codes, index+1);break; case GETFIELD: res = getCharOperand(codes, index+1);break; case PUTFIELD: res = getCharOperand(codes, index+1);break; case INVOKEVIRTUAL: res = getCharOperand(codes, index+1);break; case INVOKESPECIAL: res = getCharOperand(codes, index+1);break; case INVOKESTATIC: res = getCharOperand(codes, index+1);break; case INVOKEINTERFACE: res = getCharOperand(codes, index+1)+" "+getByteOperand(codes, index+3);break; case NEW: res = getCharOperand(codes, index+1);break; case NEWARRAY: res = getByteOperand(codes, index+1);break; case ANEWARRAY: res = getCharOperand(codes, index+1);break; case ARRAYLENGTH: break; case ATHROW: break; case CHECKCAST: res = getCharOperand(codes, index+1);;break; case INSTANCEOF: res = getCharOperand(codes, index+1);;break; case MONITORENTER: break; case MONITOREXIT: break; case WIDE: res = "XXX";break; case MULTIANEWARRAY: res = getCharOperand(codes, index+1)+" "+getByteOperand(codes, index+3);break; case IFNULL: res = getCharOperand(codes, index+1);break; case IFNONNULL: res = getCharOperand(codes, index+1);break; case GOTO_W: res = getIntOperand(codes, index+1);break; case JSR_W: res = getIntOperand(codes, index+1);break; case BREAKPOINT: break; case IMPDEP1: break; case IMPDEP2: break; default: res = "<UNKNOWN BYTECODE:"+codes[index]+">"; } return res; } public static int fourByteToInt(byte[] codes, int pos) { int b1 = (int)codes[pos + 0]; int b2 = (int)codes[pos + 1]; int b3 = (int)codes[pos + 2]; int b4 = (int)codes[pos + 3]; int val = b1 << 24 | b2 << 16 | b3 << 8 | b4; return val; } public static int stepBytecode(byte[] codes, int index) { int res = 0; switch (codes[index]) { case NOP:res++;break; case ACONST_NULL:res++;break; case LDC2_W: case LDC_W:res+=3;break; case LDC:res+=2;break; case DCONST_0: case DCONST_1: case LCONST_0: case LCONST_1:res++;break; case BIPUSH:res+=2;break; case SIPUSH:res+=3;break; case FCONST_1: case FCONST_2: case FCONST_0: case ICONST_M1: case ICONST_0: case ICONST_1: case ICONST_2: case ICONST_3: case ICONST_4: case ICONST_5:res++;break; case FALOAD: case BALOAD: case CALOAD: case SALOAD: case IALOAD:res++;break; case DALOAD: case LALOAD:res++;break; case AALOAD:res++;break; case FLOAD: case FSTORE: case ILOAD: case ISTORE:res+=2;break; case FLOAD_0: case FSTORE_0: case ILOAD_0: case ISTORE_0:res++;break; case FLOAD_1: case FSTORE_1: case ILOAD_1: case ISTORE_1:res++;break; case FLOAD_2: case FSTORE_2: case ILOAD_2: case ISTORE_2:res++;break; case FLOAD_3: case FSTORE_3: case ILOAD_3: case ISTORE_3:res++;break; case DLOAD: case DSTORE: case LLOAD: case LSTORE:res+=2;break; case DLOAD_0: case DSTORE_0: case LLOAD_0: case LSTORE_0:res++;break; case DLOAD_1: case DSTORE_1: case LLOAD_1: case LSTORE_1:res++;break; case DLOAD_2: case DSTORE_2: case LLOAD_2: case LSTORE_2:res++;break; case DLOAD_3: case DSTORE_3: case LLOAD_3: case LSTORE_3:res++;break; case ALOAD: case ASTORE:res+=2;break; case ALOAD_0: case ASTORE_0:res++;break; case ALOAD_1: case ASTORE_1:res++;break; case ALOAD_2: case ASTORE_2:res++;break; case ALOAD_3: case ASTORE_3:res++;break; case FASTORE: case IASTORE:res++;break; case DASTORE: case LASTORE:res++;break; case AASTORE:res++;break; case BASTORE:res++;break; case CASTORE: case SASTORE:res++;break; case POP:res++;break; case POP2:res++;break; case DUP:res++;break; case DUP_X1:res++;break; case DUP_X2:res++;break; case DUP2:res++;break; case DUP2_X1:res++;break; case DUP2_X2:res++;break; case SWAP:res++;break; case IADD:res++;break; case FADD:res++;break; case DADD:res++;break; case LADD:res++;break; case ISUB:res++;break; case FSUB:res++;break; case DSUB:res++;break; case LSUB:res++;break; case IMUL:res++;break; case LMUL:res++;break; case DMUL:res++;break; case FMUL:res++;break; case IDIV:res++;break; case LDIV:res++;break; case DDIV:res++;break; case FDIV:res++;break; case IREM:res++;break; case LREM:res++;break; case DREM:res++;break; case FREM:res++;break; case INEG:res++;break; case LNEG:res++;break; case DNEG:res++;break; case FNEG:res++;break; case ISHL:res++;break; case LSHL:res++;break; case ISHR:res++;break; case LSHR:res++;break; case IUSHR:res++;break; case LUSHR:res++;break; case IAND:res++;break; case LAND:res++;break; case IOR:res++;break; case LOR:res++;break; case IXOR:res++;break; case LXOR:res++;break; case IINC:res+=3;break; case I2L:res++;break; case I2F:res++;break; case I2D:res++;break; case L2I:res++;break; case L2F:res++;break; case L2D:res++;break; case F2I:res++;break; case F2L:res++;break; case F2D:res++;break; case D2I:res++;break; case D2L:res++;break; case D2F:res++;break; case I2B:res++;break; case I2C:res++;break; case I2S:res++;break; case LCMP:res++;break; case FCMPL:res++;break; case FCMPG:res++;break; case DCMPL:res++;break; case DCMPG:res++;break; case IFEQ:res+=3;break; case IFNE:res+=3;break; case IFLT:res+=3;break; case IFGE:res+=3;break; case IFGT:res+=3;break; case IFLE:res+=3;break; case IF_ICMPEQ:res+=3;break; case IF_ICMPNE:res+=3;break; case IF_ICMPLT:res+=3;break; case IF_ICMPGE:res+=3;break; case IF_ICMPGT:res+=3;break; case IF_ICMPLE:res+=3;break; case IF_ACMPEQ:res+=3;break; case IF_ACMPNE:res+=3;break; case GOTO:res+=3;break; case JSR:res+=3;break; case RET:res+=2;break; case TABLESWITCH: { int db = ((index + 4) / 4) * 4; // Align-4, step to defaultbytes db += 4; int low = fourByteToInt(codes, db); db += 4; int high = fourByteToInt(codes, db); db += 4; db += (high-low+1)*4; res = db; } break; case LOOKUPSWITCH: { int db = ((index + 4) / 4) * 4; // Align-4, step to defaultbytes db += 4; int np = fourByteToInt(codes, db); db += 4; db += np * 8; res = db; } break; case FRETURN: case IRETURN:res++;break; case LRETURN: case DRETURN:res++;break; case ARETURN:res++;break; case RETURN:res++;break; case GETSTATIC: case PUTSTATIC: case GETFIELD: case PUTFIELD:res+=3;break; case INVOKEVIRTUAL:res+=3;break; case INVOKESPECIAL:res+=3;break; case INVOKESTATIC:res+=3;break; case INVOKEINTERFACE:res+=5;break; case NEW:res+=3; break; case NEWARRAY:res+=2;break; case ANEWARRAY:res+=3;break; case ARRAYLENGTH:res++;break; case ATHROW:res++;break; case CHECKCAST:res+=3;break; case INSTANCEOF:res+=3;break; case MONITORENTER:res++;break; case MONITOREXIT:res++;break; case WIDE: switch (codes[index+1]) { case ILOAD:res+=4;break; case FLOAD:res+=4;break; case ALOAD:res+=4;break; case LLOAD:res+=4;break; case DLOAD:res+=4;break; case ISTORE:res+=4;break; case FSTORE:res+=4;break; case ASTORE:res+=4;break; case LSTORE:res+=4;break; case DSTORE:res+=4;break; case RET:res+=4;break; case IINC:res+=6;break; default:System.err.println("ERROR_INVALID_OPCODE in stepBytecode (wide)");break; } break; case MULTIANEWARRAY:res+=4;break; case IFNULL:res+=3;break; case IFNONNULL:res+=3;break; case GOTO_W:res+=5;break; case JSR_W:res+=5;break; // case BREAKPOINT: res++;break; // case IMPDEP1: res++;break; // case IMPDEP2: res++;break; default:res++;System.err.println("INVALID BYTECODE " + codes[index] + " IN stepBytecode"); } return res; } public static void printBytecode(PrintStream p, byte[] codes, int index) { p.print(toString(codes[index])+" "+getOperands(codes, index)); } public static void printBytecodes(PrintStream p, byte[] codes) { for (int i=0,cnt=1; i<codes.length; i+=stepBytecode(codes,i),cnt++) { p.print("\t"+i+"\t"+cnt+"\t"); printBytecode(p, codes, i); p.println(); } } public static void appendBytecodes(StringBuffer p, byte[] codes) { for(int i = 0, cnt = 1; i < codes.length; i += stepBytecode(codes,i), cnt++) { p.append(" " + i + " " + cnt + "\t"); p.append(toString(codes[i])+" "+getOperands(codes, i)); p.append("\n"); } } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -