我有一个大型(遗留)应用程序,我必须对其进行修复,它的代码结构很糟糕,而且代码气味如此之多,以至于我窒息。我真的无法弄清楚 gui 中的字符串在哪里填充。因此,如果一旦任何字符串(我不知道变量的名称,或者它在哪里)等于“foobar”,我就可以有一个表达式/断点,这样我就可以从那里回溯。
那么,我在寻找什么?:)
我有一个大型(遗留)应用程序,我必须对其进行修复,它的代码结构很糟糕,而且代码气味如此之多,以至于我窒息。我真的无法弄清楚 gui 中的字符串在哪里填充。因此,如果一旦任何字符串(我不知道变量的名称,或者它在哪里)等于“foobar”,我就可以有一个表达式/断点,这样我就可以从那里回溯。
那么,我在寻找什么?:)
只要您要查找的字符串没有以任何方式进行硬编码,此技巧就可以工作。如果字符串被传递给编译器,那么这个技巧可能不起作用。
java.lang.String
类文件。您的 IDE 应该会自动显示此类的源代码。char[]
在字段变量中放置一个断点。每个 JDK 的变量名称可能不同。在我的机器上是private final char value[];
.在此断点上设置条件,例如:
value!=null && value.length==6 && value[0]=='f' && value[1]=='o' && value[2]=='o' ....
请注意,由于这个断点,性能会变慢。
我已经在一个从文件中读取字符串的简单应用程序上对此进行了测试,当文件被读入字符串时,断点被正确命中。
如果您不知道 String 的填充位置,但您知道它所在的变量在哪里,则可以为该变量放置一个观察点。观察点完全作为断点放置,但位于定义变量的行中。
每次更改或读取变量时,此观察点都会暂停程序。
如果您有一个 IDE,例如 Eclipse,您可以为所有变量设置 getter 和 setter,然后,从这些 setter 中的每一个,调用一个名为“checkValue”的函数,例如,在这个“checkValue”中为您正在寻找的特定价值。
这将需要更改代码,但作为副产品,会创建更清晰的代码。
使用 jmap 并导致内存转储。检查每个转储以获取您正在寻找的值
使用 Introspection 并循环遍历每个变量,寻找值。