2014-10-24 4 views
1

Отладка от Newish до JVM.JVM Отладка без отладчика

Я работал над поддержкой других продуктов на основе VxWorks, написанных на C/C++. В рамках этой среды мы могли выполнять поиск символов в живой системе и заглядывать или вызывать память, чтобы понять, что делает программное обеспечение или изменить его, когда другие «обычные» параметры конфигурации недоступны.

Теперь я поддерживаю приложения Java. Для проблем, которые нелегко воспроизводятся в наших лабораториях, мы сводимся к перекомпиляции с помощью дополнительного инструментария и выполнению двоичных замен, чтобы собрать больше информации, чтобы понять, что происходит в sw.

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

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

Просьба не читать лекции о том, как приложение плохо спроектировано для поддержки. Это данность, мы всего лишь пара парней в поддержке, которые должны понять, насколько это возможно.

спасибо, Абэ

+0

Какие функции вам нужны в «нетрадиционном отладчике»? Я не могу себе представить, что он полезен без привязки к запущенной JVM (это уже «не вариант по ряду причин»?) – Thilo

+0

Какова целевая система (некоторые из них имеют такие инструменты, как DTrace)? – Thilo

ответ

0

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

Для меня решение заключалось в том, чтобы добавить дополнительные заявления о регистрации. Я использовал slf4j API, с реализацией логина, у меня есть enabled JMX on JVM и использовал его для enable/disable logging при необходимости и/или сменил классы, которые были зарегистрированы. Если вы используете slf4j/logback the right way, для отключенного оператора журнала очень мало накладных расходов, поэтому я смог использовать их в свободном доступе.

Таким образом, я могу включить «отладочную аппаратуру», без раздражающих пользователей с перезагрузкой.

Теперь некоторый код:

Это обкатки для эксперимента

package pl.gov.mofnet.giif.logondemand; 

import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 

public class LogOnDemand { 
    private static final Logger log = LoggerFactory.getLogger(LogOnDemand.class); 

    public static void main(String []args) throws InterruptedException { 
     for (int i = 0; i < 1000; i++) { 
      log.debug("i: {}", i); 
      Thread.sleep(1000); 
     } 
    } 
} 

необходимо поместить в пакет по умолчанию Этот файл (или где-нибудь по пути к классам).

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 
    <jmxConfigurator /> 

    <appender name="console" class="ch.qos.logback.core.ConsoleAppender"> 
    <layout class="ch.qos.logback.classic.PatternLayout"> 
     <Pattern>%date [%thread] %-5level %logger{25} - %msg%n</Pattern> 
    </layout> 
    </appender> 

    <root level="info"> 
    <appender-ref ref="console" /> 
    </root> 
</configuration> 

Этот код имеет компиляции зависимостей времени на org.slf4j: SLF4J-апи: 1.7.7 и выполнения зависимость от ch.qos.logback: Logback-классика: 1.1.2

Выполнить этот код, в Java 7 вам не нужно явно включать JMX, если вы подключаетесь к JMX с одного компьютера. Вы увидите, что на консольном сохранении нет выхода для первоначальных сообщений конфигурации журнала.

Start JConsole, подключиться к этому процессу, на вкладке MBeans вы найдете ch.qos.logback.classic узел, глубоко под ней есть operations.

Изменить параметры на setLoggerLevel, установить p1 в пакетное имя вашего класса, в данном случае pl.gov.mofnet.giif и p2 - debug.Нажмите кнопку setLoggerLevel, чтобы запустить эту операцию, вы должны увидеть сообщения журнала на консоли. Чтобы отключить ведение журнала, выполните сброс регистратора до info или выше.

+0

Ну, вы можете удалить текст «не повторений» и добавить пример/код, как/что вы сделали, чтобы сделать это хорошим ответом. – cfrick

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