2013-08-19 10 views
5

Dzisiaj badałem klasy ogromnych aplikacji (jak serwer jboss z aplikacjami) z javaagent i oprzyrządowaniem na moim openjdk 7. Nazwałem retransform na wszystkich klasach co 10 sekund, więc ich kod bajtowy dostał się w moje Implementacja ClassFileTransformer.Bajtod zmienia się w czasie w nieudokumentowany sposób

Moja implementacja po prostu śledzi zmiany kodu bajtowego klas w czasie. Przede wszystkim zdziwiłem się, że kolejność pól i metod, modyfikatorów dostępu do metod, zawartości puli stałej i innych podobnych rzeczy zmienia się z jednego czeku do drugiego. Ale nadal jest to documented.

Co nie jest udokumentowane - niektóre elementy mogą być tworzone w puli stałej klasy i wstrzykiwane do metod. Na razie zauważyłem, że ma to miejsce z wartościami liczbowymi (Longs, Doubles, Floats i inne).

Tak to wygląda w javap; przed:

pool: 
... 
#17 Float NaNf 
method: 
#1 fload #17 //NaNf 
... 

Po coś zmienił klasę podczas wykonywania:

pool: 
... 
#17 Float NaNf 
#18 Float NaNf 
method: 
#1 fload #18 //NaNf <- look, it loads #18 now 

I podwójne sprawdzone, że żadne inne transformatory lub środki są dołączone.

Dlaczego JVM nie może zostawić mojego kodu bajtowego tak samo? Gdzie mogę przeczytać o takich optymalizacjach/transformacjach (lub co jeszcze jest)? Czytałem źródła JVM, ale te tylko bardziej mnie myliły.

Po prostu próbuję stworzyć swego rodzaju weryfikator kodu bajtowego w czasie rzeczywistym - narzędzie bezpieczeństwa.

+0

Nic nie mówi, że wygenerowany kod musi być deterministyczny, o ile efekt * kodu jest deterministyczny. Nie ulega wątpliwości, że wiele różnic występuje, ponieważ rzeczy mieszają się z różnymi zasobnikami. –

+0

Przykro mi, nie zrozumiałem, co to są wiadra. Jakie masz wiadra? Przy okazji ten kod nie jest generowany. Jest skompilowany, umieszczony w słoikach i pozostaje taki sam przez cały czas. – Oroboros102

+0

Czy masz jakieś transformatory, które zmieniają kod bajtowy? – Antimony

Odpowiedz

1

Co nie jest udokumentowane - że niektóre przedmioty mogą być tworzone w puli stałej klasy i wstrzykiwane do metod.

Cóż, artykuł został połączony sobie jasno mówi:

Stała basen może mieć mniej lub więcej wpisów. Stałe wpisy puli mogą być w innej kolejności; jednakże będą odpowiadać stałe wartości puli w bajtodach metod.

Tak naprawdę to jest udokumentowane jako. Powodem jest to, że nie jest użyteczne zapamiętywanie dokładnie każdego kodu bajtowego klas, powtarzając wszystkie stałe wpisy w puli, które są takie same w wielu klasach. Maszyny JVM zwykle mają wewnętrzny format, który różni się od zwykłych plików klas i generuje plik klasy, gdy jest taka potrzeba, np. podczas wywoływania transformatora.

+0

Właściwie to martwię się zmianą metody, a nie zmianą puli klasy. Ale "JVM ... generuje plik klasy, gdy jest to potrzebne", czyni to bardziej zrozumiałym. Czy masz jakieś pomysły dotyczące wykrywania zmiany klasy (jako kod bajtowy lub tylko niektóre dane w JVM)? – Oroboros102

+0

Pytanie brzmi, jakiego rodzaju zmian oczekujesz (chcesz wykryć)? Jedynymi zmianami nie-wewnętrznymi są transformatory, a JVM wywoła wszystkie transformatory jeden po drugim. Kiedy więc usuniesz swój periodyczny spust, możesz wykorzystać fakt, że twój transformator został nazwany jako wskazówka, że ​​nastąpiła transformacja. – Holger

+0

Oczekuję złośliwych zmian kodu bajtowego metody zarówno z zewnątrz, jak i wewnątrz maszyny JVM. Teraz widzę, że problem jest prawdopodobnie nierozwiązywalny. Z pewnością nie przy pomocy transformatorów bajtowych. – Oroboros102

Powiązane problemy