每隔一段时间,我就处于 Eclipse 调试模式,希望我可以简单地选择我当前正在检查/观察的对象,在其上放置某种“对象断点”,然后跳到下一行代码访问它。
现在,我知道我可以在类上设置断点,但我通常在内存中有数百甚至数千个实例,其中大多数都有很长的生命周期。他们经常进出框架。它们被包装到集合中,再次过滤和解包。简而言之:一个常规的大型应用程序。
通常我仍然通过寻找该对象的稀有特性、使用条件方法断点和大量知情猜测来找到问题。但是,我认为如果我有类似描述的功能,我有时会更快。
经过一番搜索,我发现的是调试代理(向下滚动到示例)。它是一个容器类,将使用 Java 反射 API 使自己看起来像包含的对象,因此您可以在应用程序中使用它来代替包含的对象。作为一个 InvocationHandler,DebugProxy 现在可以“拦截”包含的 Object 中的方法调用。
使用代理进行实际调试就像将这一行添加到您的应用程序一样简单。
IMyObject = (IMyObject) DebugProxy.newInstance(new MyObject());
然后我可以在 DebugProxies 源代码中设置断点。
然而,这种方法至少存在两个问题。
- 它可以工作,但它仍然是一个 hack,并且缺少很多功能,例如过滤选项。
- Proxy-Object不能向下转换为实现类。
2.问题比较严重。我能够将 DebugProxy 与 EMF 生成的类一起使用,并且在整个框架中遵循对象没有问题。但是,当我尝试调试不使用所有有趣类的接口的代码时,DebugProxy 将很快失败。
有人知道替代品吗?也许 Eclipse JDT 调试器已经有这样的功能,而我根本看不到它!?
我知道有 Java工具 API和 AspectJ 等框架。这些可以用来获得实际的解决方案吗?