程序编译时stacktrace是怎么打印出来的?
How is the stacktrace printed when the program is compiled?
这是一个非常简单的问题:
当你编译一个 java 程序时,它被转换成字节码,因此,.java 或 .class 文件的每一行号都被遗漏了(我认为所以,可能我错了..)。那么,当您打印堆栈跟踪时,它如何设法获取调用堆栈中的所有 class 名称和行号?我想我可能在这里遗漏了一些东西,但我找不到与此相关的任何东西。
When you compile a java program, it is converted to byte code
正确。
so therefore, every line number of the .java or .class file is missed (I think so, probably I am wrong..).
你错了。行号信息嵌入到 .class 文件中,除非您以某些方式使用 -g
编译器选项。
如果存在行号,则 java 编译器创建的字节码会将 debug
标志设置为 true。这可以使用 java -g
来实现
来自 Oracle 的 javac 文档:
-g
- Generate all debugging information, including local variables. By default, only line number and source file information is generated.
-g:none
- Do not generate any debugging information.
-g:{keyword list}
- Generate only some kinds of debugging information, specified by a comma separated list of keywords. Valid keywords are:
source
- Source file debugging information
lines
- Line number debugging information
vars
- Local variable debugging information
这是一个非常简单的问题:
当你编译一个 java 程序时,它被转换成字节码,因此,.java 或 .class 文件的每一行号都被遗漏了(我认为所以,可能我错了..)。那么,当您打印堆栈跟踪时,它如何设法获取调用堆栈中的所有 class 名称和行号?我想我可能在这里遗漏了一些东西,但我找不到与此相关的任何东西。
When you compile a java program, it is converted to byte code
正确。
so therefore, every line number of the .java or .class file is missed (I think so, probably I am wrong..).
你错了。行号信息嵌入到 .class 文件中,除非您以某些方式使用 -g
编译器选项。
如果存在行号,则 java 编译器创建的字节码会将 debug
标志设置为 true。这可以使用 java -g
来自 Oracle 的 javac 文档:
-g
- Generate all debugging information, including local variables. By default, only line number and source file information is generated.
-g:none
- Do not generate any debugging information.
-g:{keyword list}
- Generate only some kinds of debugging information, specified by a comma separated list of keywords. Valid keywords are:
source
- Source file debugging information
lines
- Line number debugging information
vars
- Local variable debugging information