您能否解释一下Apache Ant中调试级别属性var,行和源的含义。很明显,这有助于生成帮助属性debug = true的所有调试信息。
定义debuglevel =" lines,vars,source"的目的是什么?这会限制调试信息吗?
如果每个值1.lines 2. vars 3. source?
我是否需要启用调试才能使此属性有效?
规范说,
要附加到-g命令行开关的关键字列表。除现代,经典(ver> = 1.2)和jikes外,所有实现都会忽略这一点。合法值为none或以逗号分隔的以下关键字列表:lines,vars和source。如果未指定debuglevel,则默认情况下不会将任何内容附加到-g。如果未打开调试,则将忽略此属性。
答案 0 :(得分:7)
在Ant中,您必须同时使用debug=true
和debuglevel=...
才能使调试正常工作。 lines,vars,source
基本上将Java代码链接回行号,源中的变量名以及源本身的名称。这样,像Findbugs这样的工具会指向源代码中的行,即使它们在类文件上工作。
运行嵌入了此信息与未嵌入的Java应用程序之间没有区别。在C中, 使用 有所作为。由于嵌入在二进制文件中的调试信息,C调试信息在二进制文件中占用更多空间而C可能执行得更慢。在Java世界中,情况并非如此,其中代码被编码为由Java Realtime Environment解释的中间文件。
我还没有看到一个Java商店没有使用嵌入在类文件中的这些信息进行编译。 Java是一个运行时代码,嵌入代码中的调试信息不会降低它的速度。 JIT编译大大加快了速度,忽略了嵌入式调试信息。此外,如果速度真的那么重要,你不应该使用Java(对不起。真相伤害。 1 )
我建议继续使用debug on编译,并将debuglevel设置为lines,vars,source
。嵌入这些调试信息可能比通过删除它可以看到的任何可能的微观速度改进更为重要。
1。在讨厌的评论之前:我主要在Java环境中工作。您可能希望在C或C ++上使用Java有很多原因,但速度不是其中之一。
然而,1980年的编程之间存在差异,当时你有一个8085芯片在3MHz运行一个完整的8位,现在甚至最垃圾的系统运行在GHz领域运行的四核64位芯片。与高效程序相比,编写易于维护和调试的程序更为重要。
答案 1 :(得分:3)
听起来你会因为从命令行编译Java代码而不是使用Ant task而感到困惑。
-g是一个命令行标志,用于传递给javac以编译源文件。有关更多信息,您可以运行javac -help
并获得以下输出。在我们的构建文件中 - 我们只需在debug=on
任务中设置<javac>
来处理请求写出正确的调试信息。
Usage: javac <options> <source files>
where possible options include:
-g Generate all debugging info
-g:none Generate no debugging info
-g:{lines,vars,source} Generate only some debugging info
-nowarn Generate no warnings
-verbose Output messages about what the compiler is doing
-deprecation Output source locations where deprecated APIs are used
-classpath <path> Specify where to find user class files and annotation processors
-cp <path> Specify where to find user class files and annotation processors
-sourcepath <path> Specify where to find input source files
-bootclasspath <path> Override location of bootstrap class files
-extdirs <dirs> Override location of installed extensions
-endorseddirs <dirs> Override location of endorsed standards path
-proc:{none,only} Control whether annotation processing and/or compilation is done.
-processor <class1>[,<class2>,<class3>...] Names of the annotation processors to run; bypasses default discovery process
-processorpath <path> Specify where to find annotation processors
-d <directory> Specify where to place generated class files
-s <directory> Specify where to place generated source files
-implicit:{none,class} Specify whether or not to generate class files for implicitly referenced files
-encoding <encoding> Specify character encoding used by source files
-source <release> Provide source compatibility with specified release
-target <release> Generate class files for specific VM version
-version Version information
-help Print a synopsis of standard options
-Akey[=value] Options to pass to annotation processors
-X Print a synopsis of nonstandard options
-J<flag> Pass <flag> directly to the runtime system
-Werror Terminate compilation if warnings occur
@<filename> Read options and filenames from file