Что делает опция отладки 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.