Определите, находится ли Java-приложение в режиме отладки в Eclipse - PullRequest
35 голосов
/ 10 июля 2009

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

Я использую eclipse для отладки приложения, поэтому, если решение работает только в Eclipse, все будет хорошо.

Ответы [ 6 ]

51 голосов
/ 29 июля 2011

Нашел ответ по как найти, если отладочный режим включен

boolean isDebug = java.lang.management.ManagementFactory.getRuntimeMXBean().
    getInputArguments().toString().indexOf("-agentlib:jdwp") > 0;

Это проверит, используется ли Java Debug Wire Protocol агент.

21 голосов
/ 10 июля 2009

Вы можете изменить конфигурацию отладки. Например, добавьте специальный аргумент VM только в конфигурации отладки. Вы можете использовать System.getProperties() для чтения предоставленных аргументов.

Еще лучше, измените конфигурации (Run и Debug), чтобы загрузить другой файл конфигурации регистрации. Это не хорошо, если вам нужно написать код для определения уровня ведения журнала. Это должно быть только вопросом конфигурации.

7 голосов
/ 10 июля 2009

Не существует официально санкционированного способа надежного определения того, находится ли какая-либо конкретная JVM в режиме отладки изнутри самой JVM, и использование артефактов просто нарушит ваш код в будущем.

Поэтому вам нужно будет самостоятельно ввести методологию. Предложения:

  • Системное свойство.
  • Переменная окружения (переменная оболочки, такая как $ HOME или% HOME%)
  • Спросите JVM о физическом местонахождении данного ресурса - http://www.exampledepot.com/egs/java.lang/ClassOrigin.html - и, основываясь на нем, примите решение (содержит ли путь слово «debug»? Находится ли он в jar или распакованном классе файл? и т. д.).
  • JNDI
  • Наличие или содержание определенного ресурса.
5 голосов
/ 10 июля 2009

Вы пытались добавить аргумент vm в конфигурации запуска eclipse?

Передайте это как аргумент VM

-Ddebug=true

тогда вы можете сделать Boolean.getBoolean("debug"), чтобы проверить это.

2 голосов
/ 10 июля 2009

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

public static final boolean DEBUG_MODE = System.getProperty("java.vm.info", "").contains("sharing");

сделает свое дело.

Только что протестировал в eclipse3.5:

package test;

public class Test
{

    /**
     * @param args
     */
    public static void main(String[] args)
    {
        System.out.println(System.getProperty("java.vm.info", ""));
    }

}

отобразит:

mixed mode, sharing

если запущен без отладки

mixed mode

если выполняется с помощью средства запуска отладки


Йоахим Зауэр комментарии:

Это сильно зависит от системы.
Я предполагаю, что «совместное использование» означает, что совместное использование классов между виртуальными машинами активно.
Это очень новая функция и доступна только на некоторых платформах.
Кроме того, может быть много возможных причин для его включения или отключения, поэтому я бы не стал использовать это для обнаружения в режиме отладки.

(Примечание: я протестировал его с последней версией jdk1.6b14. Я оставляю это как CW-ответ.)

0 голосов
/ 10 июля 2009

Посмотрите здесь:

http://wiki.eclipse.org/FAQ_How_do_I_use_the_platform_debug_tracing_facility%3F

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

Маню

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