2011-08-12 93 views
2

我記錄了來自我的Java應用程序的所有方法條目,這要歸功於JVMTI代理程序。現在,我可以獲取每個方法的名稱,但我希望能夠獲取該方法接收的參數的值。JVMTI - 如何從回調中獲取方法參數的值

此問題已在舊主題中討論過(請參閱How to get parameter values in a MethodEntry callback);它完全符合我所需要的,所以我知道我必須使用GetLocalObject函數,但我無法弄清楚如何(在主題中給出的示例已損壞)。

任何人都可以幫我找出如何做到這一點?謝謝。

回答

1

我想你想訪問任意的方法參數,而無需預知其內容,如果不是你能澄清你的問題?

查看JVMTI docs on local variables

首先,您需要確保在能力列表中啓用了本地變量訪問。然後,使用GetLocalVariableTable找出可用參數。返回的表格將包含方法中每個局部變量的描述,包括參數。當你完成後別忘了Deallocate

您需要確定哪些變量是參數。您可以通過查找當前的jlocation並消除尚不可用的局部變量來實現。這不會告訴你參數順序,但它會告訴你哪些當地人是參數。您大概可以認爲插槽號碼是正確的順序。

查找當前jlocation使用GetFrameLocation,迭代局部變量表,併爲每個局部變量,其start_location小於或等於您的當前位置,添加插槽數量和類型的參數列表。

對於每個參數,請根據其類型調用適當的GetLocal{X}方法。你需要你當前幀的深度,你已經有了GetFrameLocation的深度。

這應該讓你得到你的參數,但實現起來會很慢並且很棘手。按照指南的建議,避免MethodEntry回調並使用字節碼檢測(BCI)代替您會更好。

+0

比方說,我得到一個jobject變量,如何使用jvmti提取jobject變量的字段? – kumarD

相關問題