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

时间:2015-08-18 01:26:54

标签: java compiler-construction stack-trace bytecode

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

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

2 个答案:

答案 0 :(得分:6)

  

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

正确。

  

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

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

答案 1 :(得分:5)

如果存在行号,则java编译器创建的字节码将debug标志设置为true。这可以使用java -g

来实现

来自Oracle的javac文档:

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