【问题标题】:Eclipse conditional breakpoint, break at any string equalsEclipse条件断点,在任何字符串等于处中断
【发布时间】:2014-07-30 21:42:39
【问题描述】:

我有一个大型(旧版)应用程序,我必须对其进行修复,它的代码结构很糟糕,而且代码异味太多,让我窒息。我真的无法弄清楚 gui 中的字符串在哪里填充。因此,如果一旦任何字符串(我不知道变量的名称或它在哪里)等于“foobar”,我就可以有一个表达式/断点,这样我就可以从那里回溯。

那么,我在寻找什么? :)

【问题讨论】:

  • 不幸的是,我怀疑诸如“只要任何字符串等于 X 就中断”之类的东西是否存在,但是文本是否以某种方式从文件或数据库中获取?此外,您使用哪种 UI,也许我们可以提供 UI 填充的方法。
  • @Smutje UI 是建立在一个从范围框架构建的自制框架上的,所以这真的很难。问题在于,很多通信和访问都被混淆、抽象和纠缠在这个自制的框架中。所以有无数层需要跟踪。另外,我对一般情况感兴趣,因为在寻找特别的东西时有一些时间会是一个很好的功能。

标签: java eclipse debugging breakpoints conditional-breakpoint


【解决方案1】:

只要您要查找的字符串没有以任何方式进行硬编码,此技巧就有效。如果字符串被传递给编译器,那么这个技巧可能不起作用。

  1. 确保您已将源代码与 JDK 一起安装。
  2. 打开java.lang.String 类文件。您的 IDE 应该会自动显示此类的源代码。
  3. char[] 字段变量中放置一个断点。每个 JDK 的变量名称可能不同。在我的机器上是private final char value[];
  4. 在这个断点上设置条件,例如:

    value!=null && value.length==6 && value[0]=='f' && value[1]=='o' && value[2]=='o' ....
    

请注意,由于这个断点,性能会变慢。

我在一个从文件中读取字符串的简单应用程序上对此进行了测试,当文件被读入字符串时,断点被正确命中。

【讨论】:

  • 我无法验证这一点,但听起来很有希望!
【解决方案2】:

如果您不知道字符串的填充位置,但您知道它所在的变量在哪里,您可以为变量放置一个观察点。 观察点完全作为断点放置,但在定义变量的行中。

每次更改或读取变量时,此观察点都会暂停程序。

【讨论】:

  • 如前所述,“(我不知道变量的名称,也不知道它在哪里)”
  • 他的意思是观察字符串的来源而不是它被放入的变量。
【解决方案3】:

如果您有一个 IDE,例如 Eclipse,您可以为所有变量设置 getter 和 setter,然后,从这些 setter 中的每一个,调用一个名为“checkValue”的函数,例如,在这个“checkValue”中创建一个条件您正在寻找的特定值的断点。

这将需要更改代码,但作为副产品,会创建更清晰的代码。


使用 jmap 并导致内存转储。检查每个转储以查找您要查找的值


使用自省并循环遍历每个变量,寻找值。

【讨论】:

  • 1. “对所有变量使用 getter 和 setter”。这是不合理的,需要更改大量代码,只是为了分解变量以执行 getter 和 setter。而且,为局部变量设置 getter 和 setter 也不干净。 2. 内存转储会告诉我变量叫什么吗? 3.“每一个变量”,再一次难以做到。
  • 我没有说它们中的任何一个都很容易;)。我会继续检查答案,看看是否有人有更好的想法。最好有一个基于值的断点。
猜你喜欢
  • 2016-09-09
  • 1970-01-01
  • 2015-08-23
  • 2011-11-03
  • 2012-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多