Btrace

在之前介紹Java Agent的這篇文章中,簡單介紹了Java agent的應用,裏面提到了基於Java agent實現的線上調試利器Btrace,當我們想定位線上問題卻苦於沒有日誌時,可以使用Btrace attach到線上進程,動態的修改線上代碼,從而達到既保留現場又能定位問題的效果。

Btrace的quickstart十分簡單,並不需要有Java agent的基礎。項目的git地址是Btrace,我們找到release將Btrace下載下來,下載解壓之後直接點進去doc文件夾裏的userguide,我們就可以按照例子進行模仿開發了。

Btrace開發流程

這裏寫一個簡單的使用Btrace腳本的例子,方便大家熟悉下開發Btrace腳本的流程。

1.首先啓動一個目標Java程序,這是我們Btrace腳本要attach的進程。

2.編寫Btrace腳本,新建一個maven工程,導入Btrace相關依賴即可進行開發

@Btrace註解代表這是一個Btrace腳本。@OnMethod代表着我們註解的這個方法監控目標進程的監控點,即該方法要在什麼時候運行,這裏監控指定類的btrace方法,並且在方法返回時運行。params1代表着傳入btrace方法的參數,若參數有多個,Btrace腳本的監控方法同樣可以指定多個。被@Return註解的參數代表着btrace方法的返回值,注意這裏的類型並不是Object而是AnyType。

3.使用jps命令找到目標進程的pid

4.使用終端進入之前我們下載的Btrace壓縮包的bin目錄,使用btrace命令指定要attach的進程pid,運行我們編寫的Btrace腳本。

5.最後我們調用目標進程的btrace方法,即可在終端看到我們傳入方法的參數與方法返回值了。

Btrace的註解

關於註解這裏就偷下懶了。。。它的註解不多,用法也相對簡單,上面的幾個註解相信光看程序就可以瞭解其用法了,具體其他的註解以及使用大家查閱userguide裏的示例程序就能夠掌握,這裏就不細說了。

Btrace的unsafe模式

Btrace腳本正常情況下是運行在safe模式下的,這意味着它對程序是隻讀的,不能對其進行修改,在safe模式下使用它有很多的限制,例如不能創建對象,不能拋出異常,不能有循環代碼,不能調用外部類的方法等。正常情況下,如果我們只是想獲取一些日誌打印信息等,並不需要打破它的限制,但有時我們可能在跟蹤方法中調用JDK原生類的方法(safe模式下只允許調用BTraceUtils類中的方法),這時我們可以在使用btrace命令時加上 -u 參數,代表着Btrace腳本將運行在unsafe模式下。

Btrace進階

雖然Btrace功能強大,但也還是有一些限制,比如無法方法中獲取局部變量的值等。這時可以使用Jboss的Byteman工具,它的功能更加強大,只是它的寫法更類似於Shell腳本,對於Java程序員來說相對不太友好,但是不影響它成爲一個強大的輔助工具(感興趣的可以去官網下載並閱讀文檔瞭解用法,以後有時間會寫一下它的使用)。

最後

在線上環境運行之前一定要在本地調試下你的Btrace腳本程序,否則如果一個不小心腳本報錯會影響線上行爲。

附贈幾個有用的Btrace腳本:如何在生產環境使用Btrace進行調試Btrace入門到熟練小工完全指南,由於二者在關於典型場景部分幾個例子都差不多,所以就都貼出來了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章