编译程序时如何打印堆栈跟踪?

Pab*_*mez 0 java compiler-construction bytecode stack-trace

这是一个非常简单的问题:

当你编译一个java程序时,它被转换为字节代码,因此,错过了.java或.class文件的每个行号(我想是的,可能我错了..).因此,当您打印堆栈跟踪时,它如何设置获取调用堆栈中的所有类名和行号?我想我可能在这里遗漏了一些东西,但我找不到任何与此有关的东西.

use*_*421 6

编译java程序时,它将转换为字节代码

正确.

因此,错过了.java或.class文件的每个行号(我想是的,可能是我错了..).

你错了.除非您-g以某种方式使用编译器选项,否则行号信息将嵌入到.class文件中.


Kei*_*ith 5

如果存在行号,则java编译器创建字节码,并将debug标志设置为true.这可以通过使用来实现java -g

来自Oracle的javac文档:

  • -g
    • 生成所有调试信息,包括局部变量.默认情况下,仅生成行号和源文件信息.
  • -g:none
    • 不要生成任何调试信息.
  • -g:{keyword list} - 仅生成某些类型的调试信息,由逗号分隔的关键字列表指定.有效关键字是:
    • source
      • 源文件调试信息
    • lines
      • 行号调试信息
    • vars
      • 局部变量调试信息