问候,
我正在使用嵌入式java,我将应用程序写入低资源设备.我得到的一个问题是当代码崩溃时设备停止.我可以通过我添加的一些日志记录从中获取一些信息.(简单的打印陈述)
由于内存限制,此日志记录无法保留在应用程序中.
我想知道有没有人知道有一个标志我可以传递给JVM,如果它是我需要的调试或标准编译,请说明.
如果它是一个调试版本,我希望包含print语句,如果它是一个删除print语句的标准版本.我问,因为我要经常剪切和粘贴语句等(这是一个痛苦的事)
谢谢
您可以利用if (constant)编译器优化的事实.
在某个地方创建一个全局变量DEBUG:
public static final boolean DEBUG = true;
Run Code Online (Sandbox Code Playgroud)
然后像这样进行日志记录:
if (DEBUG) {
System.out.println("Debug");
}
Run Code Online (Sandbox Code Playgroud)
要禁用调试,只需更改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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
编译为:
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
}
更改DEBUG到false收益率:
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
}
| 归档时间: |
|
| 查看次数: |
3552 次 |
| 最近记录: |