2012-10-18 4 views
5

Java에서 객체 생성을 모니터링하기 위해 ASM을 사용하고 있습니다. 현재, 내가 newObjectReference의 사본을 복제하는Java에서 ASM을 사용하여 모니터 객체 생성

dup; 
invoke XXX.init; 
call_my_method(Object) 

내 생각에

invoke XXX.init 

에서 새 개체 및 기기 프로그램의 창조의 지표로 초기화에 전화를한다 받아 ,이 개체의 init 뒤에이 개체를 보관하기 위해 내 메서드를 호출합니다. 스레드 인스턴스가있는 경우

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

내가 사용

"-noverify"옵션을 런타임에, 두 번째 예외가 발생 :

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

그러나, 런타임시 예외가있다

두 번째 경우에는 원래 프로그램의 스레드를 제외한 ()에 대한 호출이 없음을 확신합니다.

새 개체 만들기를 모니터링하는 더 좋은 방법이 있습니까?

고마워요.

+0

할당을 모니터링하기 위해 메모리 프로파일 러를 사용할 수 없다고 가정합니다. 이 데이터를 얻었 으면이를 시각화하는 방법이 필요합니다. 예 : http://www.yourkit.com/docs/11/help/allocations.jsp –

+0

'call_my_method (Object)'에 사용하는 정확한 바이트 코드 명령어를 제공 할 수 있습니까? – vijay

+0

의견을 내 주셔서 감사합니다. 제가 실수를. 나는 'init'의 유일한 인수가 새로 생성 된 객체라고 가정했기 때문에 'dup'을 사용하면 'init'다음에이 객체를 방문 할 수 있습니다. 그러나 'init'바로 전에 새로 생성 된 객체를 '초기화'하는 데 사용되는 다른 객체가있을 수 있음을 발견했습니다. 그래서 두 가지 예외를 넘었습니다.이것은 'Thread t = new Thread (new ARunnableClass())'또는 다른 유사한 객체 생성 메소드의 바이트 코드에서 확인할 수 있습니다. 오브젝트 생성을 모니터하는 다른 방법을 찾아야합니다. –

답변

4

시도, 변환 기본적으로 init 메소드 반환 후 중복 전화

invoke XXX.init;
dup;
call_my_method(Object)

에 XXX.init를 호출합니다.

설명 : 새 객체 생성을 추적하고자 할 때, new XXX()과 같은 명령문을보고있는 것 같습니다. 즉

NEW XXX
DUP
INVOKESPECIAL <init>

NEW 바이트 코드 명령은 개체 자체를 만드는 데 사용됩니다 - : 자, 다음과 같이 바이트 코드로 변환하는 방법입니다. 스택 맨 위에 복제되므로 오브젝트 사본이 추가로 생깁니다. 이 시점에서 객체의 복사본 두 개는 초기화되지 않은 것입니다. 그리고 init 메서드는 스택 맨 위에있는 초기화되지 않은 첫 번째 객체에서 호출됩니다. 생성자가 반환 할 때까지 객체가 초기화되고 스택 맨 위에있는 객체도 초기화됩니다. (스택 위에있는 "객체"가 실제로 힙의 어딘가에있는 실제 객체를 가리키는 객체 참조이기 때문에 객체를 참조하는 대신 오브젝트라는 단어를 사용합니다. 죄송합니다이 혼란을 일으킨 경우.

+0

다시 한번 감사드립니다. 나는 또한 이것을 가능한 방법으로 발견했는데, '신'에 비교할 수없는 '초기화'가있다. 내 생각에 'Object.init'을 모니터링하는 것은 새로운 객체를 초기화 할 때 'Object'의 'init'을 호출 할 수 있기 때문에 가능합니다. –

+0

예 ... 추적 개체. 실제로 그것에 대해 갈 수있는 현명한 방법입니다 .. 공유 주셔서 감사합니다 :) 또한, 만약 당신이 일하는 해결책을 찾으면 여기에 게시하십시오. 다시 한 번 감사드립니다 :) – vijay

관련 문제