5

我想为Java创建一个反向调试器(一个可以在程序执行中倒退的调试器),为此我需要在程序执行的同时存储变量数据。我将为此使用全局缓存和更新缓存的静态方法。

我想以这样一种方式对加载的类进行检测,即在每次修改字段/变量后,将调用我的静态方法:例如:

public static void updateCache(String fullVarName, Object value){...}

我观察到的是,当更新字段时,putfield会执行一条指令。当局部变量被更新时,(I)STORE会使用一条指令。所以我想到了对类进行检测,每当找到这样的操作码时,我只需插入另一个getfieldILOAD之后,以获取更新的字段/变量的值,然后我使用 aninvokestatic来调用我的静态方法以及所有必要的信息。

问题是还有其他用例,其中变量是集合或数组,并且使用特定方法更新它们,例如在更新 a 时HashMap使用map.put(key, value). 所以我也需要拦截这些调用,但是有很多这样的方法,我需要找到它们并对其进行硬编码......
有解决方法吗?或者,也许我遗漏了一些东西,并且有一个更简单的解决方案。

编辑:我之前也研究过 JVMTI 并运行了一些基准测试。它似乎对我的用例来说太慢了,例如为我的程序增加了 7-100 倍的减速.....

4

1 回答 1

2

如果您的目标是仅获得反向调试的可能性,您可以尝试 Jive ( https://cse.buffalo.edu/jive/ )。它可以与 Eclipse 一起使用。

但是,如果您的目标是自己创建一个反向调试工具,这篇文章可能会对您有所帮助:https ://www.researchgate.net/publication/220093333_Back_to_the_Future_Omniscient_Debugging

于 2020-05-21T01:11:03.960 回答