Получение локальных переменных - PullRequest
4 голосов
/ 07 января 2011

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

Возможно ли что-нибудь подобное в Java и как можно это сделать?

Ура, Max

Ответы [ 4 ]

2 голосов
/ 28 сентября 2011

Посмотрите на этот инструмент:

http://www.chrononsystems.com/

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

Будет приятно узнать, помогло ли это:)

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

Я почти уверен, что вы не можете получить локальные переменные в трассировке стека, так как вывод создается из экземпляра StackTraceElement, который содержит только класс, файл, метод и номер строки (см. http://download.oracle.com/javase/6/docs/api/java/lang/StackTraceElement.html).

1 голос
/ 07 января 2011

Если вы используете IDE, такую ​​как Eclipse - вы можете использовать инструменты отладки для просмотра этого во время всего выполнения программы.

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

Единственный способ, которым это произойдет, - это если состояние системы может быть достигнуто через переменные, доступные выше в цепочке перехвата исключений, или через сам объект исключения (в случае пользовательского исключения):

public class MySpiffyException extends RuntimeException
{
    final private int foo;
    final private String bar;

    public MySpiffyException(String message, int foo, String bar) { 
       super(message); this.foo = foo; this.bar = bar; 
    }
    public MySpiffyException(Throwable cause, int foo, String bar) { 
       super(cause); this.foo = foo; this.bar = bar; 
    }
    public int getFoo() { return this.foo; }
    public String getBar() { return this.bar; }
}

...

public void someCode() {
   ...

   int foo = ...;
   String bar = ...;

   if (foo > 0)
      throw new MySpiffyException(foo, bar);
}
...