Что делает опция отладки javac -g: vars?
Что именно представляет собой параметр вывода -g:vars
(локальная переменная отладочной информации) javac.
Выполняя некоторые тесты, нет дополнительной информации (например, нет разницы между -g: source, lines и -g: source, lines, vars.
Есть ли у кого-нибудь пример этой локальной информации об отладке переменных?
Ответы
Ответ 1
Из javadocs:
-g Сгенерировать всю отладочную информацию, включая локальную переменные. По умолчанию используется только строка количество и исходный файл генерируется.
Это не дает видимый результат во время компиляции, но используется при отладке во время выполнения.
Ответ 2
Параметр -g:vars
будет вставлять LocalVariableTable в ваш файл класса. Например, с помощью этого тестового класса:
public class Test {
public static void main(String[] args) {
int mylocal = 1;
System.out.println("" + mylocal);
}
}
Вы можете посмотреть информацию об отладке в файле класса с помощью javap -l Test
. Без аргументов -g
существует только LineNumberTable. Это то, что JVM использует для создания номеров строк, которые вы видите в stacktraces. Если вы скомпилируете -g:vars
, вы заметите, что теперь есть LocalVariableTable, который выглядит так:
LocalVariableTable:
Start Length Slot Name Signature
0 3 0 args [Ljava/lang/String;
2 1 1 mylocal I
Это фиксирует имя и тип каждого параметра и локальной переменной по его позиции в стеке.
Обычно вам не требуется это для отладки, если у вас есть источник. Однако, если у вас нет источника, это может быть полезно. Например, запустите jdb Test
с помощью и без -g:vars
:
Initializing jdb...
> stop in Test.main
Deferring breakpoint Test.main.
It will be set after the class is loaded.
> run
main[1] next
main[1] next
main[1] locals
Method arguments:
args = instance of java.lang.String[0] (id=354)
Local variables:
mylocal = 1
Вы получите только список локалей, если класс был скомпилирован с помощью -g:vars
.