【问题标题】:What does the javac debugging information option -g:vars do?javac调试信息选项-g:vars有什么作用?
【发布时间】:2011-08-10 10:52:47
【问题描述】:

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

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

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

【问题讨论】:

    标签: java debugging


    【解决方案1】:

    来自 javadocs:

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

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

    【讨论】:

      【解决方案2】:

      -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 编译的,您只会获得本地列表。

      【讨论】:

        猜你喜欢
        • 2011-04-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-17
        • 1970-01-01
        • 2015-03-11
        • 1970-01-01
        相关资源
        最近更新 更多