eclipse - 调试时始终查看对象

eclipse - Always view object when debugging

我在 Set 中有一个对象通过引用更新了它的内容。有没有一种方法可以使用对象哈希 ID (MyObject@93efa2ed) 或 Eclipse ID (id=356) 始终在我的表达式视图中观察,即使它超出范围?

我正在使用 Eclipse Neon。

Add a toString() method in you MyObject class. You can do it through Eclipse using: right click(in MyObject) -> Source -> Generate toString(). Now you will be able to see the contents rather than hash id of MyObject.

我不太清楚你的问题,但我想你的意思是:

  • 你有一个包含在集合 S 中的对象 O,该集合 S 包含更多对象
  • O 在你的代码中更新了(即它的内部属性发生了变化),你想在单步执行代码时通过表达式视图关注这些变化
  • 你也希望这发生在代码 lines/methods 中,它没有通往 O
  • 的直截了当的路径

我不知道有什么方法(内部 eclipse 好东西)可以让你通过它的 eclipse 调试 ID 或对象哈希引用'O。

但它可以非常简单地完成:您只需要能够通过某种(冗长的)引用方式从调试器中选择的当前帧到达 O 即可完成此操作。

最简单的方法是添加一些额外的代码以将 O 设置为某种静态变量。 在 "Display" 视图的帮助下,您甚至可以在手动调试时分配静态变量,让您执行 java 代码,该代码在当前堆栈帧的上下文中运行。

步骤:

  1. create/add class MyWatcher 到你的代码库。
  2. 逐步执行您的代码以获取您对 O 的处理(例如,在示例代码中,在将 o 添加到集合时的第 5 个中断)
  3. 打开显示视图并添加此行 MyWatcher.watches.put("a", o)(将 'o' 替换为在您的断点处引用 O 的表达式)
  4. 使用 Ctrl+U 或通过上下文菜单执行行
  5. 将此添加到您的 "expressions" 视图:MyWatcher.watches.get("a")
  6. 现在 O 将始终保持可见状态,例如。在下面的示例中:即使您在 foo()、b/c 中,地图仍保留 O 上的 ar ref。
public class MyCode {

  public static void main(final String[] args) {
    bar();
    foo();
  }

  static void bar() {
    final Set<Object> set = new HashSet<>();
    for (int i = 0; i < 10; i++) {
      final List<Integer> o = Arrays.asList(i);
      set.add(o);
    }

  }

  static void foo() {
    System.out.println("bar");
  }
}

public class MyWatcher {
    public static final Map<String, Object> watches = new HashMap<>();
}