2009-08-31 26 views
8

Czy istnieje sposób na uzyskanie mapy lub innej struktury danych zmiennych lokalnych w bieżącym zakresie na maszynie JVM bez użycia debuggera? To znaczy, aby uzyskać locals bieżącej ramki stosu?Uzyskiwanie zmiennych lokalnych z ramki stosu w JVM

Wiem, że istnieją obiekty stacktrace, ale StackTraceElement nie ma możliwości uzyskania dostępu do dowolnego stanu. Po prostu mówi, jaka metoda została wywołana, ale nie w tym, co w niej było.

Odpowiedz

4

Nazwy zmiennych mogą być zawarte w plikach klas, aby pomóc w debugowaniu, ale javac nie robi tego domyślnie. Wymaga opcji -g:vars.

Jeśli jest obecny, program może użyć biblioteki inżynierskiej kodu bajtowego, takiej jak ASM, aby uzyskać dostęp do nazw i zakresu zmiennych lokalnych.

Podczas gdy this question jest źle sformułowany, myślę, że jest to duplikat, a jego odpowiedzi mogą być istotne dla twojego problemu. Dodam, że jeśli nie dbasz o nazwy, typ zmiennej lokalnej i zakres są zawsze zawarte w tabeli atrybutów każdej metody.

1

Nie sądzę, że istnieje sposób, aby to zrobić. Kompilator zawsze może optymalizować zmienne lokalne, a zastosowanie takiej metody uniemożliwiłoby kompilatorowi korzystanie z tego rodzaju optymalizacji. Podczas kompilowania metody kompilator nie byłby w stanie stwierdzić, czy wywołałeś hipotetyczny kod getLocalVariables() gdzie indziej w programie, więc musiałby zawsze umieścić wszystkie zadeklarowane zmienne lokalne w takiej mapie.

+0

Zmienne lokalne są dostępne na mapie w StackFrame. Możesz zajrzeć tutaj https://docs.oracle.com/javase/7/docs/jdk/api/jpda/jdi/com/sun/jdi/StackFrame.html –