2012-10-18 13 views
5

Używam ASM do monitorowania tworzenia obiektów w Javie. Obecnie biorę wezwanie do init, jako wskaźnik tworzenia nowego obiektu i instrumentu program zTworzenie obiektów monitora za pomocą ASM w Javie

invoke XXX.init 

do

dup; 
invoke XXX.init; 
call_my_method(Object) 

Mój pomysł jest do powielania kopii newObjectReference i , po obiekcie init nazywam moją metodę zachowania tego obiektu.

Jednakże, w czasie pracy, jest wyjątek:

java.lang.VerifyError, Expecting to find unitialized object on stack. 

Kiedy stosowany wariant "-noverify" w czasie pracy, jeżeli jest przykład gwintu, drugi wyjątek ze sterty

Exception in thread "main" java.lang.IllegalThreadStateException 
at java.lang.Thread.start(Unknown Source) 
at test.ThreadTest.test 

Dla drugiego przypadku, jestem pewien, że nie ma połączenia z start() wątku z wyjątkiem tego w oryginalnym programie.

Czy istnieje lepszy sposób monitorowania tworzenia nowego obiektu?

Wielkie dzięki.

+0

Zakładam, że nie można używać profilera pamięci do monitorowania przydziałów. Po uzyskaniu tych danych potrzebny jest również sposób ich wizualizacji. na przykład http://www.yourkit.com/docs/11/help/allocations.jsp –

+0

czy możesz podać dokładną instrukcję kodu bajtowego, której używasz dla 'call_my_method (Object)'? – vijay

+0

Dziękuję za uwagi. Popełniłem błąd. Przyjąłem, że jedynym argumentem 'init' jest nowo utworzony obiekt, więc użycie 'dup' może odwiedzić ten obiekt po 'init'. Jednak odkryłem, że tuż przed "init" może istnieć jakiś inny obiekt, który jest argumentem używanym do "zainicjowania" nowo utworzonego obiektu. Dlatego mam powyżej dwóch wyjątków.Można to sprawdzić w kodzie bajtowym "wątek t = nowy wątek (nowy ARunnableClass())" lub inne podobne metody tworzenia obiektów. Muszę znaleźć alternatywne sposoby monitorowania tworzenia obiektu. –

Odpowiedz

4

spróbować konwersji powołać XXX.init do

invoke XXX.init;
dup;
call_my_method(Object)

Zasadniczo zadzwonić duplikat po powrocie metoda startowych.

Wyjaśnienie :: Biorąc pod uwagę, że chcesz śledzić tworzenie nowych obiektów, domyślam się, że szukasz takich instrukcji, jak new XXX(). Teraz, tak jak to przekłada się na kod bajtowy jest następujący: -

NEW XXX
DUP
INVOKESPECIAL <init>

Innymi słowy, instrukcja kodu bajtowego NEW służy do tworzenia samego obiektu. Jest on duplikowany na szczycie stosu, więc masz dodatkową kopię obiektu. W tym momencie pamiętaj, że 2 kopie obiektu są niezainicjowane. A następnie metoda init jest wywoływana na pierwszym niezainicjowanym obiekcie na szczycie stosu. Do czasu powrotu konstruktora obiekt zostaje zainicjowany, a więc obiekt znajdujący się na szczycie stosu również zostaje zainicjowany. (to dlatego, że "obiekt" znajdujący się na szczycie stosu, jest w rzeczywistości odniesieniem do obiektu, wskazując na rzeczywisty obiekt, który siedzi gdzieś na stercie.) Używam słowa obiekt zamiast odniesienia do obiektu, ponieważ łatwiej jest wyjaśnić rzeczy. przepraszam, jeśli to spowodowało jakiekolwiek zamieszanie.)

+0

Jeszcze raz dziękuję. Odkryłem też, że jest to możliwy sposób, chociaż istnieje jakiś niedopasowany "init" do "nowego". Moją kolejną myślą jest monitorowanie "Object.init", ponieważ możliwe jest, że inicjalizacja każdego nowego obiektu wywoła "init" obiektu. –

+0

yup ... śledzenie obiektu. jest rzeczywiście sprytny sposób, aby przejść o tym .. dzięki za udostępnianie :) Również, jeśli znajdziesz działające rozwiązanie, zamieść go tutaj. dzięki jeszcze raz :) – vijay