为了创建一个反向的Java调试器,对Java类进行仪表化的最佳方法是什么?

问题描述 投票:1回答:1

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

我想用这样的方式来工具加载类,在每次修改fieldvariable之后,我的静态方法将被调用:例如

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

我观察到的是,当一个字段被更新时,一个... putfield 指令被执行。当一个局部变量被更新时,一个 (I)STORE 指令被使用。于是我想到了仪表类,每当发现这样的操作码,我只要再插入一条 getfieldILOAD 后,得到更新后的fieldvariable的值,然后我用一个 invokestatic 来调用我的静态方法和所有必要的信息。

问题是,在其他的使用情况下,变量是集合或数组,并且它们是用特定的方法来更新的,比如当更新一个叫做 HashMapmap.put(key, value). 所以我也需要拦截这些调用,但是这样的方法很多,我需要把它们全部找到并硬编码。有什么变通的办法吗?或者也许我遗漏了什么,有一个更简单的解决方案。

编辑:我之前也研究过JVMTI,跑过一些基准测试。它似乎对我的使用情况来说太慢了,比如说给我的程序增加了7-100倍的速度......。

java debugging bytecode instrumentation reverse-debugging
1个回答
2
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.