Java, как отследить вызванные функции - PullRequest
3 голосов
/ 13 января 2011

Я хочу отследить начало [и окончание] функций, вызываемых в Java, например, следующий код:

    public void foo() {
  System.out.println("begin of foo()");
  ...
  System.out.println("e-n-d of foo()");
 }

Но поддержание кода дампа System.out.println является утомительным и подверженным ошибкамведь в классе могут быть десятки функций.

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

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

Ответы [ 4 ]

9 голосов
/ 13 января 2011

Другим подходом будет использование BTrace - оно похоже на AspectJ, но может подключаться к работающему Java-приложению и применять код регистрации на лету (он также может отсоединяться от приложения,удаляя весь введенный код, но оставляя приложение работающим, как оно было до использования BTrace )

Чтобы использовать BTrace , вы должны написать простой скрипт трассировки, который будет POJOпомечены BTrace аннотациями (и некоторыми ограничениями относительно того, что можно использовать, чтобы избежать сбоя целевого приложения).

В этом случае скрипт будет выглядеть так:

@BTrace public class FooTracer {
  @OnMethod(clazz="Bar", method="foo")
  public static void onEntry() {
    println("begin of foo()");
  }

  @OnMethod(clazz="Bar", method="foo", location=@Location(Kind.RETURN))
  public static void onExit() {
    println("end of foo");
  }
}

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

2 голосов
/ 13 января 2011

Если существует много методов для входа, можно использовать AOP .Например, aspectJ.

2 голосов
/ 13 января 2011

Самый простой подход - это тот, который вы выбрали.

Простая замена вызовов System.out будет состоять в использовании каркаса ведения журнала.Затем вы можете включать и выключать информацию в соответствии с выбранным «уровнем ведения журнала»

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

Возможно, подход, основанный на инструментах, соответствует вашим потребностям: так называемые «профилировщики» могут «обрабатывать» ваш код и сообщать, какой именно метод был вызван во время выполнения.

0 голосов
/ 13 января 2011

Вы можете использовать log4j для этого:

static Logger log = Logger.getLogger(
                      log4jExample.class.getName());

public void loggedMethod() {

 log.info("begin of loggedMethod()");
  ...
 log.info("e-n-d of loggedMethod()");
}
...