【发布时间】:2011-08-10 10:52:47
【问题描述】:
javac 的-g:vars(局部变量调试信息)选项究竟提供了什么作为输出。
做一些测试,没有附加信息(例如-g:source,lines和-g:source,lines,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 用来生成您在堆栈跟踪中看到的行号的内容。如果您使用-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 编译的,您只会获得本地列表。
【讨论】: