2

我有以下问题,我们甚至可以称之为经典问题:

public void myMethod(Map<Object, Object> parameter){

    someOtherObject.method(parameter);
    .
    .
    .
    someOtherThirdPartyObject.method(parameter);

}

突然间,最后有些方法触及了输入参数Map,我不知道在哪里以及如何。现在,我知道使参数不可变是可取的,但事实并非如此,这就是问题的根源。例如,myMethod 中的方法旨在执行一些验证,但它们也执行更多操作,这在设计上是错误的。

那么,问题是如何在这个方法中创建一个断点,如果这个参数 Map 的一个属性发生变化,执行就会暂停?在每个方法调用之后放置一个条件断点可能是一个好主意,但是如果你有 20 多个方法,那就相当痛苦了。

当这个输入参数发生变化时,我该如何调试?

4

3 回答 3

2

你想要的似乎被称为“观察点”。我实际上并不知道这个功能的存在,而且我曾经在 Eclipse 项目上工作过!

http://help.eclipse.org/indigo/index.jsp?topic=%2Forg.eclipse.cdt.doc.user%2Ftasks%2Fcdt_t_add_watch.htm

看起来您必须弄清楚正在编辑哪些字段,然后使用上面的帮助文档设置“写入”观察点。

此外,Eclipse 会突出显示已修改的变量,因此如果您逐个遍历方法调用,您将能够看到哪个正在修改值(以及正在修改哪个字段),因为它将突出显示(亮黄色,由默认)在“调试”透视图的“变量”选项卡中。一旦你知道修改数据的方法是什么,你就可以再次运行调试,但这一次调试改变值的方法,并不断重复,直到你发现问题。

于 2012-05-12T09:17:16.740 回答
1

这是一个经典的问题解决方案,您从一个非常大的搜索空间开始,然后系统地和方法地缩小搜索空间,直到搜索空间小到足以让您找到问题。

如果您试图定位您的地图被错误修改的位置,您可能希望首先从 myMethod 的更高级别开始。在 myMethod 方法中调用的方法周围放置断点。在每个断点处,查看 Map 的内容。Eclipse 有一个变量监视面板,您可以在其中查看每个变量在特定时刻的内容。

当您到达发现有问题的断点时。停止。您现在知道如何someOtherObject.method(parameter);假设数据在其断点处发生更改。

现在, someotherObject.method 中可能会有其他方法。将断点放在此方法中,围绕它的所有函数调用并重复该过程。继续重复,直到没有更多的方法。最终,您将缩小问题范围并获得答案。

不幸的是,对于这些类型的问题,没有神奇的“修复我的代码”按钮。只需要良好的、老式的福尔摩斯式的调查技巧和推理来消除你知道不是问题的代码区域,直到你留下一个更小的部分来让你找到根本原因。

于 2012-05-12T09:17:25.987 回答
0

如果不允许修改代码,则可以

  • 使用 acattle 描述的 watchpoints 方法来观察这个特定地图实例的变化,或者
  • 在 Map 方法中有断点来修改其状态(如果您想为多个实例执行此操作)。Map代码只是二进制无关紧要,您仍然可以使用Ctrl-Shift-T(打开类型)打开它,在大纲视图中选择put(...)或remove(...)等方法,然后使用大纲视图中的上下文菜单添加断点。
于 2012-05-12T09:44:19.893 回答