LazierTracker icon indicating copy to clipboard operation
LazierTracker copied to clipboard

不能debug的情况有没有遇到啊?

Open liangxianshen opened this issue 5 years ago • 5 comments

liangxianshen avatar Dec 21 '18 09:12 liangxianshen

这个项目是可以debug的,奇怪的是我没有发现任何不一样的地方。 https://github.com/JeasonWong/CostTime

liangxianshen avatar Dec 22 '18 08:12 liangxianshen

@liangxianshen 有字节码插入的地方,源码行号变了,所以不能debug的吧,我这边也有这个问题。暂无解决方案。

nailperry-zd avatar Jan 09 '19 04:01 nailperry-zd

@liangxianshen 有字节码插入的地方,源码行号变了,所以不能debug的吧,我这边也有这个问题。暂无解决方案。

不光不能debug,混淆后的crash日志是没有行号的 哈哈 我继续看看巴掌写的CostTime 那个真的是能debbu,并且也插入字节码了,用的也是ASM

liangxianshen avatar Jan 09 '19 06:01 liangxianshen

9、集成到项目后,断点失效,bugly上报异常时,错误出处不能定位行号,unknow source? private static byte[] modifyClass(byte[] srcClass) throws IOException { ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_MAXS) ClassVisitor methodFilterCV = new MethodFilterClassVisitor(classWriter) ClassReader cr = new ClassReader(srcClass) cr.accept(methodFilterCV, 0/ClassReader.SKIP_DEBUG/); return classWriter.toByteArray(); } 只有当 ClassReader.accept(ClassVisitor cw,int flag)的第二个参数是0的时候,生成的class字节码反编译后可正常读取行号等信息。

AllennZhang avatar Feb 11 '19 03:02 AllennZhang

为了访问行号和局部变量名,ClassReader 类可能需要引入“人为”Label 对象,也就是说,跳转指令并不需要它们,它们只是为了表示调试信息。这可能会在诸如 3.2.5 节介绍的情景中导致错误判断,在该情景中,指令序列中部的一个 Label 被认为是一个跳转目标,因此禁止这一序列被删除。 为避免这种误判,可以在 ClassReader.accept 方法中使用 SKIP_DEBUG 选项。有了这一选项,类读取器不会访问调试信息,不会为它创建人为标记。当然,调试信息会从类中删除,因此,只有在不会为应用程序造成问题时才能使用这一选项。 注意:ClassReader 类提供了其他一些选项,比如:SKIP_CODE,用于跳过对已编译代码的访问(如果只需要类的结构,那这个选项是很有用的);SKIP_FRAMES,用于跳过栈映射帧;EXPAND_FRAMES,用于解压缩这些帧。 ASM开发手册有讲到, @liangxianshen @nailperry-zd

AllennZhang avatar Feb 11 '19 03:02 AllennZhang