4

每隔一段时间,我就处于 Eclipse 调试模式,希望我可以简单地选择我当前正在检查/观察的对象,在其上放置某种“对象断点”,然后跳到下一行代码访问它。

现在,我知道我可以在类上设置断点,但我通常在内存中有数百甚至数千个实例,其中大多数都有很长的生命周期。他们经常进出框架。它们被包装到集合中,再次过滤和解包。简而言之:一个常规的大型应用程序。

通常我仍然通过寻找该对象的稀有特性、使用条件方法断点和大量知情猜测来找到问题。但是,我认为如果我有类似描述的功能,我有时会更快。

经过一番搜索,我发现的是调试代理(向下滚动到示例)。它是一个容器类,将使用 Java 反射 API 使自己看起来像包含的对象,因此您可以在应用程序中使用它来代替包含的对象。作为一个 InvocationHandler,DebugProxy 现在可以“拦截”包含的 Object 中的方法调用。

使用代理进行实际调试就像将这一行添加到您的应用程序一样简单。

IMyObject = (IMyObject) DebugProxy.newInstance(new MyObject());

然后我可以在 DebugProxies 源代码中设置断点。

然而,这种方法至少存在两个问题。

  1. 它可以工作,但它仍然是一个 hack,并且缺少很多功能,例如过滤选项。
  2. Proxy-Object不能向下转换为实现类

2.问题比较严重。我能够将 DebugProxy 与 EMF 生成的类一起使用,并且在整个框架中遵循对象没有问题。但是,当我尝试调试不使用所有有趣类的接口的代码时,DebugProxy 将很快失败。

有人知道替代品吗?也许 Eclipse JDT 调试器已经有这样的功能,而我根本看不到它!?

我知道有 Java工具 API和 AspectJ 等框架。这些可以用来获得实际的解决方案吗?

4

1 回答 1

1

我向 DebugProxy 添加了基本过滤并修改了输出,因此 Eclipse 控制台视图显示了指向调用代码行的链接: 在此处输入图像描述

不过,第二个问题仍未解决。我把源代码放在了 GitHub 上。也许有人会想出什么办法。

解决此问题的一种完全不同的方法是自动添加断点,并将当前的 hashCode() 与相关对象的 HashCode 进行比较。对于更了解 JDT 内部的人来说,这可能并不太难。

于 2012-11-25T18:14:40.550 回答