这样的错误竟然能得到正确的值,这个bug藏的够深的。
2011-05-08 18:32
429 查看
为了统计方法执行时候,我用ASM在方法开始的时候插入一个变量startLocal记录开始执行的时间,然后在结束的时间用当前时间去差这个开始时间,为了调试,我同时又插入了一个endLocal
却得不到正确的结果了。于是反复查看地,终于发现了
this.startLocal = this.newLocal(Type.getType(Long.class));
应该是:
this.startLocal = this.newLocal(Type.LONG_TYPE);
如果开始分配的栈不对,两个object的栈相当于一个long的栈,但在LSUB的时候为什么是正确的?
两个Long对象进行lsub,虽然java源码在编译的时候可以自动插入转换指令,但在上面的字节码指令中
仍然可以正确LSUB,虽然栈中的值是正确的,但却越过了类型检查。
/** * Project: dragoon-common-2.5.3 * * File Created at 2011-5-5 * $Id$ * * Copyright 1999-2100 Alibaba.com Corporation Limited. * All rights reserved. * * This software is the confidential and proprietary information of * Alibaba Company. ("Confidential Information"). You shall not * disclose such Confidential Information and shall use it only in * accordance with the terms of the license agreement you entered into * with Alibaba.com. */ package com.alibaba.instrumention.classop; import com.alibaba.citrus.asm.MethodVisitor; import com.alibaba.citrus.asm.Opcodes; import com.alibaba.citrus.asm.Type; import com.alibaba.citrus.asm.commons.AdviceAdapter; /** * Comment of InstrumtionAdviceAdapter * * @author axman.wang */ public class InstrumentionAdviceAdapter extends AdviceAdapter { private String methodName; //private int access; private String className; private int startLocal; protected InstrumentionAdviceAdapter(MethodVisitor mv, int access, String methodName, String desc, String signature, String[] exceptions,String className) { super(mv, access, methodName, desc); this.methodName = methodName; //this.access = access; this.className = className; } protected void onMethodEnter() { this.mv.visitLdcInsn(className + "." + methodName); this.mv.visitMethodInsn(Opcodes.INVOKESTATIC, "com/alibaba/instrumention/classop/InstrumentionStat", "before", "(Ljava/lang/String;)V"); this.startLocal = this.newLocal(Type.getType(Long.class)); this.mv.visitMethodInsn(INVOKESTATIC, "java/lang/System", "nanoTime", "()J"); this.mv.visitVarInsn(LSTORE, startLocal); } protected void onMethodExit(int opcode) { this.mv.visitMethodInsn(INVOKESTATIC, "java/lang/System", "nanoTime", "()J"); this.mv.visitVarInsn(LLOAD, startLocal); this.mv.visitInsn(LSUB); this.mv.visitLdcInsn(className + "." + methodName); this.mv.visitMethodInsn(Opcodes.INVOKESTATIC, "com/alibaba/instrumention/classop/InstrumentionStat", "after", "(JLjava/lang/String;)V"); } }
却得不到正确的结果了。于是反复查看地,终于发现了
this.startLocal = this.newLocal(Type.getType(Long.class));
应该是:
this.startLocal = this.newLocal(Type.LONG_TYPE);
如果开始分配的栈不对,两个object的栈相当于一个long的栈,但在LSUB的时候为什么是正确的?
两个Long对象进行lsub,虽然java源码在编译的时候可以自动插入转换指令,但在上面的字节码指令中
仍然可以正确LSUB,虽然栈中的值是正确的,但却越过了类型检查。
相关文章推荐
- 在利用的ndk-r10d在 as中交叉编译动态库,出现的这个错误,切记,这个是ndk-r10d的一个bug,详细如下
- vs2010未能正确加载vsts for database professional sql server data-tier application这个错误
- 网上对C#/.NET的集合类型的整理,各有错误;这个图,虽不完整细致,但是肯定正确无误
- 使用了 :before 等伪元素中的其中一个来做 animation 动画; 在 animation 动画改变了其中的某个 rem 的值; 在这样的前提下,又是使用有这个 bug 的版本浏览器,那么就
- 在Vista以上版本运行WTL程序,有时候会提示“这个程序可能安装补正确...”的错误
- 注册OCX失败:由于应用程序配置不正确,程序未能启动.重新安装应用程序可能会纠正这个错误
- 记录一个bug,逻辑错误,结果正确,异步代码调试及IE下的渲染机制
- 莫名其妙的出现这个错,看了logcat 说是什么二进制xml错误啥的。。。 不过后来发现,这个一般都是给eclipse项目中添加图片等资源时出现的一些bug,看似添加到项目中,其实没有,或
- 转:解决VC2005程序的一个运行错误“由于应用程序的配置不正确,应用程序未能启动,重新安装应用程序可能会纠正这个问题”
- VC2005程序的一个运行错误 由于应用程序配置不正确,应用程序未能启动。重新安装应用程序可能会纠正这个问题。
- gl.h文件错误(折腾了两天竟然是这个问题)
- 并行配置信息包含错误。由于应用程序配置不正确,应用程序未能启动。重新安装应用程序可能会纠正这个问题
- 解决VC2005程序的一个运行错误“由于应用程序的配置不正确,应用程序未能启动,重新安装应用程序可能会纠正这个问题”
- 这个常见的错误。大家记录下自己曾遇到的这样问题的解决方法
- 程序员的生活就是每天,在代码中游走,还得不断地调试BUG,不断的积累解决错误的能力,这样才能成为一个合格的程序员!
- 安装Ubuntu之后默认英文,选简体中文,正常来说这样装好就应该能用的,可是这个时候又出现了错误,說:broken package database. 请用apt-get install -f解决问题
- VC2005程序的一个运行错误 由于应用程序配置不正确,应用程序未能启动。重新安装应用程序可能会纠正这个问题。
- 修改bug的方法 此网页上的错误可能会使它无法正确运行
- 编程中无穷大的设定 很多人可能设为0x7fffffff,这个数的确是32-bit int的最大值,符号位为0,其他的都是1 但在很多情况下,0x7fffffff会出现错误,比如溢出,这样两个无穷大数相
- 大约xib连接错误bug正确