Я отлаживаю в довольно сложном программном обеспечении.Некоторая строка создается и заменяется измененной формой в нескольких разных местах (стек имеет длину страницы), но я хочу быстро выяснить, где строится строка с заданным значением в первый раз.Условные точки останова кажутся хитрыми, поскольку само условие создает строку, которую я хочу обнаружить ...
Есть идеи?Я использую IntelliJ
Чтобы избежать создания новой строки внутри условия, вы можете сравнивать содержимое, а не объекты String.Например, как это:
Arrays.equals(str.toCharArray(), new char[]{'c', 'o', 'n', 't', 'e', 'n', 't'});
Это может быть не самым простым подходом, если вы ищете внутреннюю строку (например, константы времени компиляции) или JVM выполняет дедупликацию строки (функция G1GC).
Чтобы сделать его более хитрым, в Java 9 было по крайней мере два изменения, которые будет трудно сломать в точке:
JEP 280: Указание конкатенации строк - InvokeDynamic makeConcatWithConstants вместо StringBuilder при конкатенации констант времени компиляции с оператором + для уменьшения байт-кода (см. эту статью для объяснения ).
InvokeDynamic
makeConcatWithConstants
StringBuilder
+
JEP 254: компактные строки - строки Latin1 хранятся как byte[]
byte[]
Если вы знаете, что вы строите свою строку с StringBuilder, я быпоместите точку останова в методе StringBuilder.toString(), где, как мы надеемся, строка построена впервые.
StringBuilder.toString()
В противном случае отладка удачи через внутреннее устройство JVM, например java.lang.invoke.StringConcatFactory.
java.lang.invoke.StringConcatFactory