我想跟蹤哪個方法調用java.lang.Thread.start()方法。 如何使用ASM Bytecode Library實現它...?ASM Bytecode跟蹤Thread.start()方法
回答
嗯,這在很大程度上取決於你想跟蹤哪些代碼量:
- 你想知道你的應用程序的類調用
Thread.start
:然後,你需要儀器應用程序的所有類。 - 您是否想知道任何類別在哪裏調用
Thread.start
,包括那些Java標準API:然後,您需要儀器Thread
,但是難以實現。
爲了實現(1)目標,你可以註冊一個Java agent (tutorial attached),將分析的被加載的類的任何方法,並檢查他們的呼叫Thread.start
。無論何時您發現這種方法,您都需要爲這些方法添加某種跟蹤機制,例如調用System.out.println
。 ASM has an excelent tutorial,他們甚至在方法字節碼的章節中提供了一個類似的例子。此外,您可以使用ASMifier
來打印出您實際需要實現的代碼。 (2)的目標是難以實現的。爲了做到這一點,你將不得不redefine the class for Thread
這可能會導致一些嚴重的麻煩,因爲它是一個系統類。在Thread
類中,可以調用Thread.getStackTrace
並檢查當前調用堆棧頂部的方法名稱,該調用堆棧由StackTraceElement
表示。您將再次必須啓用跟蹤此方法,例如通過調用System.out.println
。
我會推薦你第一個策略,因爲這樣做更容易。此外,根據您運行應用程序的位置,您可能會破壞JDK的使用許可證。
您是否聽說過['new Throwable().getStackTrace()'](http://docs.oracle.com/javase/7/docs/api/java/lang/Throwable.html#getStackTrace())?獲取調用者並不困難(儘管不推薦用於生產代碼)。 – Holger
我其實沒有想到這一點。然而,你不會得到調用者實例的控制權,只能改變它的類型。然後再一次,你可以在調試的時候找到那個實例,所以有可能是使用JNI或者一些API的方法。 –
我更新了我的答案。謝謝你的提示。我嘗試了一下,發現'Thread.getStackTrace'比創建'Throwable'更容易。 –
你可以編寫自己的javaagent來轉換所有的方法。它應該搜索java.lang.Thread.start()
調用並在它們之前添加日誌記錄。
所以,你應該檢查所有的方法和查找以下字節碼指令:
INVOKEVIRTUAL java/lang/Thread start()V
和指令之前插入這樣的事情:
GETSTATIC java/lang/System out Ljava/io/PrintStream;
LDC ${current_method_name_and_desc}
INVOKEVIRTUAL java/lang/PrintStream println (Ljava/lang/String;)V
嗨,正如你告訴我有我自己的javaagent,但啓動方法是本地方法,所以如果我做跟蹤的啓動方法,我的jvm崩潰。它正在爲其他方法工作...是以任何其他方式?或使用ASM本機方法不能檢測? –
@RameshSubramanian,你不應該改變'start'方法本身,而是所有其他的調用'start'的方法。我會延長我的答案並展示主要想法。 –
您的信息:'start'不是本地方法,它在本地調用'start0'。因此,在不推薦的情況下,啓動'啓動'會假設成爲可能。 –
- 1. ASM ByteCode - 異常的堆棧跟蹤
- 2. ASM ByteCode - 覆蓋visitLine()方法
- 3. 在ASM漂亮的打印方法Bytecode
- 4. Bytecode in asm operators &&或||
- 5. 通過ASM跟蹤方法的依賴關係
- 6. 簡單的方法來堆積幾個ASM-Bytecode訪問者?
- 7. 麻煩理解方法用Java中的ASM Bytecode重命名
- 8. RubyMonk跟蹤方法
- 9. ASM Java的BCI,跟蹤方法的參數值/方法返回值
- 10. 使用ASM進行測試Bytecode
- 11. 跟蹤Perl方法調用
- 12. 跟蹤方法執行
- 13. iOS SDK - 跟蹤viewDidLoad方法
- 14. 添加跟蹤方法System.Diagnostics.TraceListener
- 15. Android方法調用跟蹤
- 16. ASM Bytecode將值作爲參數傳遞給某些方法的調用
- 17. 爲什麼不跟蹤跟蹤調用方法像「String#size」?
- 18. 禁用ibm websphere中的跟蹤/跟蹤方法
- 19. Erlang跟蹤:無法打開跟蹤
- 20. 跟蹤所有方法和類
- 21. 用戶跟蹤表設計和方法
- 22. 需要跟蹤API的方法
- 23. 設置跟蹤方法EGL在Android
- 24. 用instagram api跟蹤喜歡的方法?
- 25. Visual Studio:實時方法調用跟蹤?
- 26. 跟蹤/攔截方法調用
- 27. jvm方法調用歷史跟蹤
- 28. SQL數據庫跟蹤方法
- 29. 跟蹤服務間通話的方法
- 30. Kinect快速手部跟蹤方法
你可以修補java.lang.Thread中和使用反射查找並記錄呼叫者。 – Antimony