Отладка / Стандартная сборка Java-приложения - PullRequest
3 голосов
/ 15 мая 2009

Привет,

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

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

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

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

Спасибо

Ответы [ 3 ]

8 голосов
/ 15 мая 2009

Вы можете использовать тот факт, что 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

}
1 голос
/ 15 мая 2009

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

Если это только последнее, то просто оберните свои записи в журнале if-check, как уже упоминалось в других ответах.

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

1 голос
/ 15 мая 2009

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

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

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

private static final DEBUG = false;

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...