簡體   English   中英

Byteman-跟蹤給定包中的所有類和方法

[英]Byteman - trace all classes and methods in a given package

使用Byteman時,我們必須在規則語法中指定類和方法。 如果要使用Byteman跟蹤程序執行情況怎么辦?

示例:執行程序功能時,我不知道正在執行哪些方法。 我想在功能執行期間識別被調用的方法。

這是否意味着我必須為給定包中的每個類的每個方法添加一條規則? 還是有其他方法可以實現這一目標?

是的,從本質上講,您需要為要跟蹤的每種方法都制定一個規則(盡管有一種簡單的方法可以執行此操作-參見下文)。

Byteman故意避免對要注入的CLASS和METHOD使用通配符模式。 那是因為使用這些規則會大大降低JVM的速度。

為什么? 好吧,每次加載一個類時,Byteman都會被問到“您是否想通過向其中注入一些代碼來轉換該類?”。 當前,Byteman按CLASSNAME索引所有已加載的規則。 因此,回答該問題涉及哈希表查找(實際上,有兩個-一個帶有裸名,另一個帶有包限定名)。 這意味着沒有答案(幾乎總是正確的答案)是超快速的。 如果Byteman允許CLASSNAME使用模式,則它不能依賴簡單的哈希查找。

例如,如果您有類似CLASS org的模式。 .Foo和2個類(例如org.my.app.FooBar和org.my.app.Bletch),您如何確定第一個與第二個不匹配? 您必須為每個類名稱的每個模式規則嘗試模式匹配。 即使是單個模式匹配,也比哈希表查找要昂貴得多。 如果您使用了多個基於模式的規則,那么成本將根據規則數量成倍增加。

好的,那么您如何解決Byteman的這一限制? 如果您想檢測很多類+方法,那么我建議您使用一個程序來生成一個規則腳本,其中包含您感興趣的每個類+方法的規則。編寫一個程序來讀取包含如下條目的文件

class_name1 method_pattern1 class_name2 method_pattern2。

該文件說我要檢測其類與method_pattern1匹配的CLASS class_name1的所有方法。

只要目標罐子在您的類路徑中,您就可以使用當前的類加載器按名稱加載每個類(調用this.getClass()。getClassLoader()以獲得類加載器,然后調用classloader.loadClass(class_name)獲得所需的類加載器類)。 使用反射獲取類方法的列表。 對於每種方法,如果該方法的名稱與相應的method_pattern匹配,則將AT ENTRY規則和/或AT EXIT規則輸出到腳本文件。

如果您想看一些代碼來做類似的事情,請查看Byteman源代碼中的contrib / dtest軟件包。

https://github.com/bytemanproject/byteman/tree/master/contrib/dtest

如果您對Byteman有任何其他疑問,請在項目提供的Byteman官方用戶論壇上提問:

https://developer.jboss.org/en/byteman?view=discussions

問候,

Andrew Dinn(Byteman項目負責人)

看起來Byteman並非您所需的正確工具。 更好的結果將通過以下方式提供: UnderstandJProfiler 特別是在多線程環境中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM