我正在使用ASM監視Java中的對象創建。目前,我接電話到初始化爲創建一個新的對象和工具的程序的指示從在Java中使用ASM監視對象的創建
invoke XXX.init
到
dup;
invoke XXX.init;
call_my_method(Object)
我的想法是複製newObjectReference的副本, ,在這個對象的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
對於第二種情況,我確信除了在原始程序中,除開始()之外沒有任何呼叫。
有沒有更好的方法來監視新的對象創建?
非常感謝。
我假設你不能使用內存分析器來監視分配。一旦你有這些數據,你也需要一種可視化的方式。例如http://www.yourkit.com/docs/11/help/allocations.jsp –
你能提供你用於'call_my_method(Object)'的確切字節碼指令嗎? – vijay
感謝您的評論。我犯了一個錯誤。我假設'init'的唯一參數是新創建的對象,所以使用'dup'可以在'init'之後訪問這個對象。但是,我發現,在'init'之前,可能有一些其他對象是用於「初始化」新創建的對象的參數。這就是爲什麼我有兩個例外。這可以在'線程t =新線程(新ARunnableClass())'或其他類似的對象創建方法的字節碼中驗證。我需要找到一些替代方法來監視對象創建。 –