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

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

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

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

来自javadocs:

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

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

-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 

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

如果您有可用的源,通常不需要这个用于调试。 但是,如果您没有源它可能是有用的。 例如,使用和不使用-g:vars运行jdb Test

 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编译类,您将只获取本地列表。