我想为Java创建一个反向调试器(一个可以在程序执行中倒退的调试器),为此我需要在程序执行的同时存储变量数据。我将为此使用全局缓存和更新缓存的静态方法。
我想以这样一种方式对加载的类进行检测,即在每次修改字段/变量后,将调用我的静态方法:例如:
public static void updateCache(String fullVarName, Object value){...}
我观察到的是,当更新字段时,putfield
会执行一条指令。当局部变量被更新时,(I)STORE
会使用一条指令。所以我想到了对类进行检测,每当找到这样的操作码时,我只需插入另一个getfield
或ILOAD
之后,以获取更新的字段/变量的值,然后我使用 aninvokestatic
来调用我的静态方法以及所有必要的信息。
问题是还有其他用例,其中变量是集合或数组,并且使用特定方法更新它们,例如在更新 a 时HashMap
使用map.put(key, value)
. 所以我也需要拦截这些调用,但是有很多这样的方法,我需要找到它们并对其进行硬编码......
有解决方法吗?或者,也许我遗漏了一些东西,并且有一个更简单的解决方案。
编辑:我之前也研究过 JVMTI 并运行了一些基准测试。它似乎对我的用例来说太慢了,例如为我的程序增加了 7-100 倍的减速.....