检测 Java 类以创建反向 Java 调试器的最佳方法是什么?

Nff*_*ff3 5 java debugging instrumentation bytecode reverse-debugging

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

我想以这样的方式检测加载的类,在每个字段/变量修改后,我的静态方法将被调用:例如:

public static void updateCache(String fullVarName, Object value){...}
Run Code Online (Sandbox Code Playgroud)

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

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

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

小智 2

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

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