2011-01-12 57 views
4

我使用ASM API進行Java字節碼instrumantation,我希望能夠確定在每次訪問任何數組時訪問哪個數組(每個數組的名稱)。在Java字節碼中獲取堆棧操作數的arrayref

我有兩個問題: - 讓我們以iastore指示爲例。 arrayref放在操作數堆棧下的兩個其他變量 - 值和索引。我如何得到arrayref而不損壞堆棧(我不能在堆棧中複製兩個以上的頂層變量)? 我想從棧中彈出指數和價值,並將其保存的地方,然後得到數組引用,並最終推動指數和值回到堆棧,但我真的不知道如何做到這一點?

  • 我想從arrayref(一旦擁有它)得到數組的名稱(用戶聲明該數組稱爲它的名稱)。

在此先感謝。

+1

你是什麼意思的「陣列的名稱」? – 2011-01-12 19:22:28

+0

您可以從類文件中獲取變量名稱。然而,許多變量(本地和成員)可以指向相同的數組對象,所以你想要哪個變量名? – Anon 2011-01-12 19:49:43

回答

0

dup2_x1, pop2, dup_x2您現在在堆棧頂部有arrayref。但總的來說,使用局部變量更簡單,JIT之後的最終結果應該沒有什麼不同。

正如其他人所評論的,您的問題的第二部分沒有多大意義。對象在變量中不是必需的,您可以分配和使用數組,而無需將其存儲到任何變量中。

但我懷疑你的意圖是追蹤像x[0]=1這樣的訪問,並將其歸因於x,這可以通過數據流分析來實現。你會跟蹤aload和那些值的使用位置,如果你的arrayref是直接來自aload,你知道這個數組來自一個變量。