線上問題偶爾發(fā)生洒放,最讓人苦惱的是,在問題追蹤過程中滨砍,有些關(guān)鍵位置沒有打log往湿,無(wú)法進(jìn)一步確定問題原因。
重新加日志發(fā)布項(xiàng)目惋戏?
當(dāng)然可以领追,但顯然線上運(yùn)行服務(wù),大部分情況下响逢,是不允許這樣做的绒窑。
為了解決這種問題,Btrace 應(yīng)運(yùn)而生舔亭。
查了不少Btrace 資料些膨,本人也親自實(shí)踐了一下蟀俊,總結(jié)出一些遇到的坑和解決方法。
Btrace 使用有兩種方法
1. 工程引入maven 依賴
<dependency>
? ? ? ? ? <groupId>com.sun.tools.btrace</groupId>
??????????<artifactId>btrace-boot</artifactId>
??????????<version>1.3.11.3</version>
</dependency>
<dependency>
???<groupId>com.sun.tools.btrace</groupId>
???<artifactId>btrace-agent</artifactId>
???<version>1.3.11.3</version>
</dependency>
<dependency>
???<groupId>com.sun.tools.btrace</groupId>
???<artifactId>btrace-client</artifactId>
???<version>1.3.11.3</version>
</dependency>
工程里可以寫好 Btrace 調(diào)試腳本订雾,編譯后發(fā)布項(xiàng)目肢预,在服務(wù)器可以直接執(zhí)行腳本,監(jiān)控目標(biāo)方法洼哎。
2. VisualVM 插件
這種方法好處是VisualVM 界面直觀的顯示烫映,可以在VisualVM直接寫腳本,start 啟動(dòng)噩峦,就可以監(jiān)控 目標(biāo)JVM 窑邦。
這里有點(diǎn)小坑,就是VisualVM 自身的Tools -->Plugins --> Availabel Plugins 下壕探,選擇 BTrace Workbench 。大部分情況下安裝不成功的郊丛。
解決方法:直接去Btrace 官網(wǎng)李请,自己下載插件安裝,鏈接:https://visualvm.github.io/uc/release20/updates.html
下載上圖中3個(gè)插件文件厉熟,然后在VisualVM 中 Downloaded 欄导盅,點(diǎn)擊 Add Pligins , 選擇以上3個(gè)插件, 點(diǎn)擊左下角 install 安裝即可揍瑟。
安裝成功如下圖白翻,Installed 欄里會(huì)有顯示
插件安裝成功后,本地IDEA啟動(dòng)你的項(xiàng)目绢片,VisualVM 就可以看到本地JVM進(jìn)程滤馍。右鍵可以看到 Trace application?
這里可以編輯 Btrace 嵌入代碼,具體怎么寫可以看看資料底循,比較簡(jiǎn)單巢株。
需要注意的就是unsafe模式,如果想用第三方j(luò)ar 包熙涤,比如 JSONObject. 需要設(shè)置 unsafe=true.?
@BTrace(unsafe=true)
點(diǎn)擊 start ,啟動(dòng)寫好的腳本阁苞,成功的話,如下圖:
接下來祠挫,會(huì)觀察到那槽,Output 面板有 Btrace 日志輸出,根據(jù)自己的需要等舔,打印參數(shù)和返回結(jié)果骚灸,監(jiān)控RT可以用@Duration,單位是 納秒软瞎。
注意:
1. 使用VisualVM 插件Btrace 時(shí)逢唤,工程中不需要依賴btrace的jar 包拉讯,否則會(huì)報(bào)錯(cuò),因?yàn)?jar 包版本不同鳖藕,會(huì)有沖突魔慷。
2. VisualVM的Btrace插件只能監(jiān)測(cè) 本地服務(wù),遠(yuǎn)程通過JMX連接后著恩,沒有?Trace application院尔。
這里很坑。喉誊。邀摆。。伍茄。
我用了很多種方式試了栋盹,折騰好久,都沒解決敷矫,開始以為是我哪里配置的不對(duì)例获。
最后查了很多資料,才知道不支持遠(yuǎn)程曹仗。大部分博客這里都輕描淡寫榨汤,沒有提到這一點(diǎn),容易誤導(dǎo)大家以為可以連遠(yuǎn)程使用怎茫。
這里感覺很雞肋收壕,本來用Btrace 就是為了遠(yuǎn)程在線追蹤代碼的,不支持遠(yuǎn)程轨蛤,要你何用蜜宪?本地我可以直接debug 豈不更好?
還有一種選擇是使用 阿里的?Arthas 祥山。Arthas 雖然也是通過命令觀察端壳,不支持界面操作,不過比Btrace簡(jiǎn)單很多枪蘑,做了通用封裝损谦。