javac的调试选项-g 主要包含了三个子选项:lines, vars, source
如果没有指定-g参数,javac是默认包含了lines和source选项,若指定-g参数则会包含所有三个选项。
下面分别简要解释下三个子选项的意义和效果:
source: 将该class文件对应的源文件名称写进class中,这样在调试进入这个类时调试器就可以找到指定的源文件。可能有些同学会问:class的类名不就是源文件的名称吗,包命就是从classpath开始的路径。这种情况只是针对访问修饰符为public的类,一个源文件可以定义多个类(甚至是内部类)。如果在调试的过程中说找不到源文件,则很有可能是在编译的时候没有加上该选项。
lines: 将源文件中的行号和class中字节码的偏移量对应起来,这样当你下断点的时候,调试器就知道该断点对应到class字节码的哪条指令。如果不设置该选项,那么你根本就没办法下断点。抛异常的时候也不会给出行数信息。
vars: 局部变量的符号表。比如在eclipse调试的时候,可以边调试边看变量的信息,这些都要归功与局部变量的符号表,它可以帮助把运行过程中的变量值和源代码中的变量名对应起来。如果没有它,调试的时候是不能看到局部变量的值的,方法的参数也变成了arg1,arg2…。