2009-05-15 2 views
3

Привет,Отладка/стандартная сборка Java-приложения

Я использую встроенную Java, я пишу приложение для устройства с низким ресурсом. Одна из проблем, которые я получаю, - это когда код прерывает работу устройства. Я могу получить небольшую информацию от него с некоторыми регистрационными данными, которые я добавил. (Простые операторы печати)

Этот журнал не может оставаться в приложении из-за ограничений памяти.

Мне было интересно, кто-нибудь знает, есть ли флаг, который я могу передать JVM, чтобы указать, требуется ли его отладочная или стандартная компиляция.

Я бы хотел, чтобы утверждения печати включались, если их отладочная сборка, если она является стандартной сборкой для удаления операторов печати. Я спрашиваю, потому что я постоянно вырезать и вставить заявления и т.д. (это боль)

Благодаря

ответ

8

Вы можете использовать тот факт, что if (constant) оптимизирован компилятором.

Сделать глобальную переменную где-то под названием 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 

}

Изменение 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 

}
+0

Можно ли установить эту константу времени компиляции с целью построения с чем-то вроде Maven? Кто-нибудь добился успеха в этом, или это единственный способ вручную изменить его перед сборкой? – crush

1

Ну, вам придется использовать препроцессор, и до сих пор это будет своего рода некрасиво.

Просто предварительно обработайте свой источник перед компиляцией. Например, используется cpp.

Говорит, что Javac иногда может упасть заявления в мертвых состоянии отраслей, в том числе статического конечных булевых, как

private static final DEBUG = false; 

if(DEBUG) System.err.println("Entered"); 

Но я не уверен, я советую вам попробовать, что и проверить, если байткод содержит что вызов.

1

является вопрос о том, что заявления протоколирования должны быть удалены из стандартная версия, или просто, что они не могут быть включены?

Если это только последнее, просто оберните ваши записи журнала в случае проверки, как упомянули другие ответы.

Независимо от того, что вы делаете, не продолжайте копировать и вставлять код в проект и из него - автоматизировать эту ручную работу. Спасите себя.

Смежные вопросы