编译调试信息的Java程序是否应该不用于生产系统?

时间:2009-11-13 16:41:08

标签: java debugging compiler-construction javac

我是否应该避免在Java类中使用Javac编译调试信息以便在生产服务器中使用?我应该注意哪些速度或安全问题?

请注意,我指的是调试信息,如堆栈跟踪中的行号,而不是记录器的调试级别。


相关问题:

5 个答案:

答案 0 :(得分:8)

您的意思是使用调试选项进行编译吗? Is there a performance difference between Javac debug on and off?

答案 1 :(得分:5)

作为一名开发人员,我建议尽可能多地离开。推理?

有一天,你会在你的程序中遇到一个错误,你所拥有的 ONLY 信息是一个堆栈跟踪,并且错误无法在命令中重现,它完全是原来的意外程序员,修复它是你的工作。在该堆栈中可用的信息越多越好!保留所有调试信息!

如果可以,则使用日志框架(将堆栈跟踪记录到文件中),该框架可以提供有关找到每个类的jar文件的信息。 Logback可以做到这一点,我相信log4j也可以。

你可能不会允许包含所有这些信息,但我相信你应该首先大叫并尖叫,并说它应该留在应急原因中。

Performancewise我相信,因为HotSpot它并不重要。

答案 2 :(得分:3)

如果您的意思是行号信息,对于打印堆栈跟踪,那么保持这一点通常是一个好主意。客户可以在错误报告中粘贴堆栈跟踪,供您使用。

如果您真的担心可见的方法名称,可以使用ProGuard或其他混淆器。 ProGuard具有很好的特性,它可以对堆栈跟踪进行去混淆,因此客户仍然可以将它们发送给您。

混淆不是很完美,所以如果你不想花费精力,没有做错就没有错。

答案 3 :(得分:0)

取决于程序的调试过度和性能敏感度。世界上90%的中等调试者不必担心。

您始终可以使用预处理器来消除代码。

答案 4 :(得分:0)

我同意BalusC的观点,即生产中的loglevels通常可以设置得更高(产量更低),而不是测试。我认为完全删除日志记录会产生反作用。即使在生产中也会发生代码错误,并且您需要日志信息以查明发生的情况。

Assert语句也不是什么大问题,除非在一段性能敏感的代码中。您应该能够将它们完全保留,因为断言语句通常用于检查不会发生的事情(如果使用正确)。但是,通过麻烦,尽可能地解决它们并不是真的有必要。

我个人认为,在生产中安装的软件应该尽可能接近开发软件,因为它经常被测试。