我想为Java创建一个反向调试器(一个可以在程序执行中向后退的调试器),为此我需要在程序执行的同时存储变量数据。为此我将使用一个全局缓存和一个更新缓存的静态方法。
我想用这样的方式来工具加载类,在每次修改fieldvariable之后,我的静态方法将被调用:例如
public static void updateCache(String fullVarName, Object value){...}
我观察到的是,当一个字段被更新时,一个... putfield
指令被执行。当一个局部变量被更新时,一个 (I)STORE
指令被使用。于是我想到了仪表类,每当发现这样的操作码,我只要再插入一条 getfield
或 ILOAD
后,得到更新后的fieldvariable的值,然后我用一个 invokestatic
来调用我的静态方法和所有必要的信息。
问题是,在其他的使用情况下,变量是集合或数组,并且它们是用特定的方法来更新的,比如当更新一个叫做 HashMap
与 map.put(key, value)
. 所以我也需要拦截这些调用,但是这样的方法很多,我需要把它们全部找到并硬编码。有什么变通的办法吗?或者也许我遗漏了什么,有一个更简单的解决方案。
编辑:我之前也研究过JVMTI,跑过一些基准测试。它似乎对我的使用情况来说太慢了,比如说给我的程序增加了7-100倍的速度......。
如果你的目标是只获得反向调试的可能性,你可以尝试Jive (https:/cse.buffalo.edujive。). 它可以和Eclipse一起使用。
但如果你的目标是自己创建一个反向调试工具,这篇文章可能会帮助你。https:/www.researchgate.netpublication220093333_Back_to_the_Future_Omniscient_Debugging