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

时间:2011-04-21 16:18:39

标签: java debugging

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

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

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

2 个答案:

答案 0 :(得分:29)

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

答案 1 :(得分:14)

来自javadocs:

  

-g       生成所有调试信息,包括本地信息   变量。默认情况下,只有行   编号和源文件信息是   生成。

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