Java应用程序的调试/标准构建
您好 我使用嵌入式java,我将应用程序编写到一个低资源设备上。我遇到的一个问题是,当代码崩溃时,设备就会停止。通过添加一些日志,我可以从中获得一些信息。(简单的打印语句) 由于内存限制,此日志记录无法保留在应用程序中 我想知道是否有人知道我可以传递给JVM一个标志来说明我需要的是调试还是标准编译 如果是调试版本,我希望包含print语句,如果是标准版本,则删除print语句。我这样问是因为我必须不断地剪切和粘贴声明等(这很痛苦)Java应用程序的调试/标准构建,java,debugging,Java,Debugging,您好 我使用嵌入式java,我将应用程序编写到一个低资源设备上。我遇到的一个问题是,当代码崩溃时,设备就会停止。通过添加一些日志,我可以从中获得一些信息。(简单的打印语句) 由于内存限制,此日志记录无法保留在应用程序中 我想知道是否有人知道我可以传递给JVM一个标志来说明我需要的是调试还是标准编译 如果是调试版本,我希望包含print语句,如果是标准版本,则删除print语句。我这样问是因为我必须不断地剪切和粘贴声明等(这很痛苦) 谢谢好吧,你必须使用前置处理器,但这还是有点难看 只需在编译之前
谢谢好吧,你必须使用前置处理器,但这还是有点难看 只需在编译之前对源代码进行预处理。例如,使用
cpp
据说javac有时可能会删除死状态分支中的语句,包括静态final布尔,比如
private static final DEBUG = false;
if(DEBUG) System.err.println("Entered");
但是我不确定,我建议您尝试一下,并检查字节码是否包含该调用。您可以利用这样一个事实,即
如果(常量)
是由编译器优化的
在某个地方创建一个名为DEBUG
的全局变量:
public static final boolean DEBUG = true;
然后像这样进行日志记录:
if (DEBUG) {
System.out.println("Debug");
}
要禁用调试,只需将DEBUG
更改为false
,编译器就会优化所有日志记录语句。您可以通过使用javap-c
查看生成的字节码来验证这一点
例如:
class DebugTest {
public static final boolean DEBUG = true;
public static void main(String[] args) {
if (DEBUG) {
int a = 10;
System.out.println("a = " + a);
}
}
}
汇编如下:
Compiled from "DebugTest.java"
class DebugTest extends java.lang.Object{
public static final boolean DEBUG;
DebugTest();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."":()V
4: return
public static void main(java.lang.String[]);
Code:
0: bipush 10
2: istore_1
3: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
6: new #3; //class java/lang/StringBuilder
9: dup
10: invokespecial #4; //Method java/lang/StringBuilder."":()V
13: ldc #5; //String a =
15: invokevirtual #6; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
18: iload_1
19: invokevirtual #7; //Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
22: invokevirtual #8; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
25: invokevirtual #9; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
28: return
}
问题是日志记录语句必须从标准版本中删除,还是不能启用 如果只是后者,就不要像其他答案提到的那样,简单地将日志语句包装在If检查中
无论您做什么,都不要继续在项目中复制/粘贴您的代码-自动完成手动工作。节省您自己的时间。是否可以使用Maven之类的构建目标设置此编译时常量?是否有人成功地做过这样的事情,或者是在构建之前手动更改它的唯一方法? Compiled from "DebugTest.java" class DebugTest extends java.lang.Object{ public static final boolean DEBUG; DebugTest(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."":()V 4: return public static void main(java.lang.String[]); Code: 0: return }