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