2012-10-18 44 views
5

Java'da Nesne oluşturmayı izlemek için ASM kullanıyorum. Şu anda, newObjectReference bir kopyasını çoğaltmak içinMonitör Nesnesi Oluşturma Java'da ASM kullanarak

dup; 
invoke XXX.init; 
call_my_method(Object) 

My fikrine

invoke XXX.init 

yeni nesne ve enstrüman bir program oluşturulması göstergesi olarak init çağrısı olduğu alıp Bu nesnenin init sonra, bu nesneyi tutmak için yöntemimi çağırırım. Bir iplik örneği varsa

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

kullandığım

"-noverify" seçeneği, çalışma sırasında, ikinci bir özel durum:

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

Ancak, çalışma sırasında, bir istisna vardır

İkinci durumda, orijinal programda belirtilen bir iş parçacığının başlangıç ​​() öğesine çağrı olmadığından emin olabilirsiniz.

Yeni Nesne Oluşturmayı izlemek için daha iyi bir yol var mı?

Çok teşekkürler.

+0

Tahsisleri izlemek için bir bellek profiler kullanamazsınız varsayalım. Bu verilere sahip olduğunuzda, görselleştirmenin de bir yoluna ihtiyacınız var. Örneğin. http://www.yourkit.com/docs/11/help/allocations.jsp –

+0

'call_my_method (Object)' için kullandığınız tam bytecode komutunu sağlayabilir misiniz? – vijay

+0

Yorumlar için teşekkür ederiz. Bir hata yaptım. 'Init' in tek argümanı yeni yaratılan nesne olduğunu varsaydım, bu yüzden 'dup' kullanmak 'init' den sonra bu nesneyi ziyaret edebilir. Bununla birlikte, 'init' ten hemen önce, yeni yaratılan nesneyi 'başlatmak' için kullanılan argümanın başka bir nesnesi olabileceğini buldum. Bu yüzden iki istisnayı aştım.Bu, 'Thread t = new Thread (yeni ARunnableClass())' veya diğer benzer nesne oluşturma yöntemlerinin bytecode'unda doğrulanabilir. Nesne oluşturmayı izlemek için bazı alternatif yollar bulmalıyım. –

cevap

4

deneyin, dönüştürme Temelde init yöntemi döndükten sonra yinelenen çağrı

invoke XXX.init;
dup;
call_my_method(Object)

için XXX.init çağırmak.

Explanation: Yeni nesne oluşturma işlemlerini izlemek istediğinizde, yeni XXX() gibi ifadelere baktığınızı tahmin ediyorum. Başka bir deyişle

NEW XXX
DUP
INVOKESPECIAL <init>

, YENİ baytkodu talimat nesnenin kendisini oluşturmak için kullanılır: - Şimdi, aşağıdaki gibi bu baytkoduna çevirir yoludur. Yığının üstünde çoğaltılarak, nesnenin ek bir kopyasına sahip olursunuz. Bu noktada, nesnenin 2 kopyası başlatılmamış olur. Ve sonra init yöntemi, yığınının üstünde ilk başlatılmamış nesne üzerinde çağrılır. Kurucu geri döndüğünde, nesne başlatılır ve böylece yığının üstüne oturan nesne de başlatılır. (yani, yığının üstüne oturan "nesne", yığın üzerinde bir yere oturmuş olan gerçek nesneyi işaret eden gerçekten bir nesne referansıdır. Nesneye başvurmak yerine sözcük nesnesini kullanırım, çünkü nesneleri açıklamak daha kolaydır. Bu herhangi bir karışıklığa neden olduysa üzgünüz.)

+0

Tekrar teşekkürler. Bunun da olası bir yol olduğunu buldum, ancak “yeni” ye eşi benzeri olmayan bazı “init” ler var. Başka bir düşüncem de 'Object.init' 'i izlemek, çünkü her yeni nesnenin başlatılmasının' Object 'in' init 'ini başlatması mümkün olacaktır. –

+0

yup ... izleme Nesnesi. aslında bu konuda gitmek için akıllı bir yoldur .. paylaşım için teşekkürler :) Ayrıca, bir çalışma çözümü bulursanız, buraya gönderin. Tekrar teşekkürler :) – vijay