Ich verwende ASM, um Objekterstellung in Java zu überwachen. Derzeit nehme ich den Anruf zu init als Indikator für die Schaffung eines neuen Objekts und Instrument ein Programm vonMonitor Objekterzeugung mit ASM in Java
invoke XXX.init
zu
dup;
invoke XXX.init;
call_my_method(Object)
Meine Idee ist eine Kopie von newObjectReference zu duplizieren und , nach der init dieses Objekts, rufe ich meine Methode, um dieses Objekt zu halten.
jedoch während der Laufzeit, gibt es eine Ausnahme:
java.lang.VerifyError, Expecting to find unitialized object on stack.
Als ich noch "-noverify" Option, während der Laufzeit, wenn es eine Thread-Instanz ist, eine zweite Ausnahme ausgelöst:
Exception in thread "main" java.lang.IllegalThreadStateException
at java.lang.Thread.start(Unknown Source)
at test.ThreadTest.test
Für den zweiten Fall bin ich sicher, es gibt keinen Anruf an Start() eines Threads mit Ausnahme der im ursprünglichen Programm.
Gibt es eine bessere Möglichkeit, die Erstellung neuer Objekte zu überwachen?
Vielen Dank.
Ich nehme an, Sie können einen Speicher-Profiler nicht verwenden, um Zuordnungen zu überwachen. Sobald Sie diese Daten haben, müssen Sie sie auch visualisieren. z.B. http://www.yourkit.com/docs/11/help/allocations.jsp –
können Sie die genaue Bytecode-Anweisung angeben, die Sie für 'call_my_method (Object)' verwenden? – vijay
Vielen Dank für die Kommentare. Ich machte einen Fehler. Ich habe angenommen, dass das einzige Argument von 'init' das neu erstellte Objekt ist, also kann 'dup' dieses Objekt nach 'init' aufrufen. Ich habe jedoch festgestellt, dass kurz vor der 'init' ein anderes Objekt das Argument sein könnte, das verwendet wird, um das neu erstellte Objekt 'zu initialisieren'. Deshalb habe ich oben zwei Ausnahmen bekommen.Dies kann im Bytecode von 'Thread t = neuer Thread (new ARunnableClass())' oder anderen ähnlichen Objekterzeugungsmethoden verifiziert werden. Ich muss einige alternative Möglichkeiten finden, um die Objekterstellung zu überwachen. –