javac调试信息选项-g:vars有什么作用?

Mig*_*uel 21 java debugging

究竟什么-g:vars(javac的局部变量调试信息)选项提供输出.

做一些测试,没有附加信息(例如-g:source,lines和-g:source,lines,vars之间没有区别.

有人有这些局部变量调试信息的例子吗?

ata*_*lor 29

-g:vars选项将在您的类文件中插入LocalVariableTable.例如,使用此测试类:

public class Test {
    public static void main(String[] args) {
        int mylocal = 1;
        System.out.println("" + mylocal);
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以查看类文件中的调试信息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
Run Code Online (Sandbox Code Playgroud)

这将通过堆栈上的位置捕获每个参数和局部变量的名称和类型.

如果您有可用的源,通常不需要此调试.但是,如果您没有源,它可能很有用.例如,运行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
Run Code Online (Sandbox Code Playgroud)

如果编译了类,您将只获取本地列表-g:vars.


小智 14

来自javadocs:

-g生成所有调试信息,包括局部变量.默认情况下,仅生成行号和源文件信息.

这在编译时不会产生可见输出,但在运行时用于调试.