Java应用程序的调试/标准构建

Java应用程序的调试/标准构建,java,debugging,Java,Debugging,您好 我使用嵌入式java,我将应用程序编写到一个低资源设备上。我遇到的一个问题是,当代码崩溃时,设备就会停止。通过添加一些日志,我可以从中获得一些信息。(简单的打印语句) 由于内存限制,此日志记录无法保留在应用程序中 我想知道是否有人知道我可以传递给JVM一个标志来说明我需要的是调试还是标准编译 如果是调试版本,我希望包含print语句,如果是标准版本,则删除print语句。我这样问是因为我必须不断地剪切和粘贴声明等(这很痛苦) 谢谢好吧,你必须使用前置处理器,但这还是有点难看 只需在编译之前

您好

我使用嵌入式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 }