究竟什么-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
.