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