Java Eclipse条件断点,在任何字符串处中断等于

Java Eclipse条件断点,在任何字符串处中断等于,java,eclipse,debugging,breakpoints,conditional-breakpoint,Java,Eclipse,Debugging,Breakpoints,Conditional Breakpoint,我有一个大型(遗留)应用程序,我必须对其进行修复,代码结构糟糕,代码气味太多,让我窒息。我真的不知道gui中的字符串填充在哪里。因此,如果任何字符串(我不知道变量的名称或它在哪里)等于“foobar”时,我可以以某种方式拥有一个表达式/断点,这样我就可以从那里回溯 那么,我在找什么呢?:) 如果您不知道字符串在哪里填充,但您知道它所在的变量在哪里,那么您可以为该变量放置一个观察点。 观察点正好作为断点放置,但位于定义变量的行中 每次更改或读取变量时,此观察点都会暂停程序。如果您有一个IDE,如E

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


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

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


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

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

这将需要更改代码,但作为副产品,将创建更干净的代码


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



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

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

  • 确保已将源代码与JDK一起安装
  • 打开
    java.lang.String
    类文件。IDE应该自动显示此类的源代码
  • char[]
    字段变量中放置断点。每个JDK的变量名可能不同。在我的机器上,它是
    私有最终字符值[]
  • 在此断点上设置一个条件,例如:

    value!=null && value.length==6 && value[0]=='f' && value[1]=='o' && value[2]=='o' ....
    
  • 请注意,由于此断点,性能将变慢


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

    不幸的是,我怀疑是否存在类似“任何字符串等于X时中断”的情况,但文本是否以某种方式从文件或数据库中获取?此外,您使用哪种用户界面,也许我们可以帮助您了解用户界面填充的方法。@Smutje用户界面是建立在一个自制的框架上的,该框架是从scope框架构建的,因此这非常困难。问题在于,在这个自制的框架中,许多通信和访问都被模糊、抽象和纠缠在一起。所以有无数层需要跟踪。另外,我对一般性很感兴趣,因为在寻找某个特定的东西时有一些时间是一个很好的功能。正如前面提到的,“(我不知道变量的名称,或者它在哪里)”他是想观察字符串的源,而不是它放入的变量。1。“对所有变量使用getter和setter”。这是不合理的,有很多代码需要更改,只是为了进行getter和setter而分解变量。而且对于局部变量使用getter和setter也不是很干净。2.内存转储会告诉我变量的名称吗?3.“每一个变量”,再一次很难做到。我没有说其中任何一个是容易的;)。我会不断核对答案,看看是否有人有更好的想法。最好有一个基于值的断点。我无法验证这一点,但听起来很有希望!