日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

如何在生产环境使用Btrace进行调试

發(fā)布時(shí)間:2024/1/17 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何在生产环境使用Btrace进行调试 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?

背景

記得前幾天有人問我:在生產(chǎn)環(huán)境中可能經(jīng)常遇到各種問題,你們一般是如何進(jìn)行調(diào)試的? 很慚愧,沒有經(jīng)驗(yàn)。因?yàn)槠綍r(shí)碰不到生產(chǎn)環(huán)境的服務(wù)器,定位問題需要各種數(shù)據(jù),所以大多數(shù)問題的解決方式都是在本地打斷點(diǎn)進(jìn)行調(diào)試,或者在測試環(huán)境利用輸出日志進(jìn)行調(diào)試,這種方式簡單粗暴,但過程比較繁瑣,需要各種重新發(fā)布,重啟應(yīng)用,還不能保證一次就找到問題的根源。直到最近才了解到Btrace這個(gè)工具,對于這樣一個(gè)神器,我覺得有必要記錄一篇,讓更多的人知道。

Btrace

BTrace是sun公司推出的一款Java 動(dòng)態(tài)、安全追蹤(監(jiān)控)工具,可以在不用重啟的情況下監(jiān)控系統(tǒng)運(yùn)行情況,方便的獲取程序運(yùn)行時(shí)的數(shù)據(jù)信息,如方法參數(shù)、返回值、全局變量和堆棧信息等,并且做到最少的侵入,占用最少的系統(tǒng)資源。

項(xiàng)目地址:Btrace
用戶指南:UserGuide

由于Btrace會(huì)把腳本邏輯直接侵入到運(yùn)行的代碼中,所以在使用上做很多限制:
1、不能創(chuàng)建對象
2、不能使用數(shù)組
3、不能拋出或捕獲異常
4、不能使用循環(huán)
5、不能使用synchronized關(guān)鍵字
6、屬性和方法必須使用static修飾

根據(jù)官方聲明,不恰當(dāng)?shù)氖褂肂Trace可能導(dǎo)致JVM崩潰,如在BTrace腳本使用錯(cuò)誤的class文件,所以在上生產(chǎn)環(huán)境之前,務(wù)必在本地充分的驗(yàn)證腳本的正確性。

Btrace可以做什么?

1、接口性能變慢,分析每個(gè)方法的耗時(shí)情況;
2、當(dāng)在Map中插入大量數(shù)據(jù),分析其擴(kuò)容情況;
3、分析哪個(gè)方法調(diào)用了System.gc(),調(diào)用棧如何;
4、執(zhí)行某個(gè)方法拋出異常時(shí),分析運(yùn)行時(shí)參數(shù);
5、....

Btrace第一個(gè)例子

package com.metty.rpc.common; import java.util.Random;/*** Created by j_zhan on 2016/11/28.*/ public class BtraceCase {public static Random random = new Random();public int size;public static void main(String[] args) throws Exception {new BtraceCase().run();}public void run() throws Exception {while (true) {add(random.nextInt(10), random.nextInt(10));}}public int add(int a, int b) throws Exception {Thread.sleep(random.nextInt(10) * 100);return a + b;} }

執(zhí)行add方法時(shí),對傳入?yún)?shù)、返回值以及執(zhí)行耗時(shí)進(jìn)行分析,btrace腳本:

通過jps命令獲取pid為8454
執(zhí)行btrace 8454 Debug.java實(shí)現(xiàn)對運(yùn)行代碼的監(jiān)控,輸出結(jié)果如下:

可以發(fā)現(xiàn),Btrace可以獲取每次執(zhí)行add方法時(shí)的數(shù)據(jù),當(dāng)然Btrace能做的遠(yuǎn)遠(yuǎn)不止這些,比如獲取當(dāng)前jvm堆使用情況、當(dāng)前線程的執(zhí)行棧等等。

參數(shù)說明

@OnMethod

Btrace使用@OnMethod注解定義需要分析的方法入口

在@OnMethod注解中,需要指定class、method以及l(fā)ocation等,class表明需要監(jiān)控的類,method表明需要監(jiān)控的方法,指定方式如下:
1、使用全限定名:clazz="com.metty.rpc.common.BtraceCase", method="add"
2、使用正則表達(dá)式:clazz="/javax\\.swing\\..*/", method="/.*/"
3、使用接口:clazz="+com.ctrip.demo.Filter", method="doFilter"
4、使用注解:clazz="@javax.jws.WebService", method=""@javax.jws.WebMethod"
5、如果需要分析構(gòu)造方法,需要指定method="<init>"

@Location

定義Btrace對方法的攔截位置,通過@Location注解指定,默認(rèn)為Kind.ENTRY
1、Kind.ENTRY:在進(jìn)入方法時(shí),調(diào)用Btrace腳本
2、Kind.RETURN:方法執(zhí)行完時(shí),調(diào)用Btrace腳本,只有把攔截位置定義為Kind.RETURN,才能獲取方法的返回結(jié)果@Return和執(zhí)行時(shí)間@Duration

3、Kind.CALL:分析方法中調(diào)用其它方法的執(zhí)行情況,比如在execute方法中,想獲取add方法的執(zhí)行耗時(shí),必須把where設(shè)置成Where.AFTER

?

4、Kind.LINE:通過設(shè)置line,可以監(jiān)控代碼是否執(zhí)行到指定的位置

?

5、Kind.ERROR, Kind.THROW, Kind.CATCH
用于對某些異常情況的跟蹤,包括異常拋出,異常被捕獲,異常未捕獲被拋出方法之外

如何使用Btrace定位問題

1、找出所有耗時(shí)超過1ms的過濾器Filter

?

由于@Dutation返回的時(shí)間是納秒級別,需要進(jìn)行轉(zhuǎn)換,如果定位一個(gè)Filter性能變慢,接著使用@Location(Kind.CALL)進(jìn)行更細(xì)粒度的分析。

2、分析哪個(gè)方法調(diào)用了System.gc(),調(diào)用棧如何?

通過查看調(diào)用棧,可以很清楚的發(fā)現(xiàn)哪個(gè)類哪個(gè)方法調(diào)用了System.gc()

3、統(tǒng)計(jì)方法的調(diào)用次數(shù),且每隔1分鐘打印調(diào)用次數(shù)

Btrace的@OnTimer注解可以實(shí)現(xiàn)定時(shí)執(zhí)行腳本中的一個(gè)方法

4、方法執(zhí)行時(shí),查看對象的實(shí)例屬性值

通過反射機(jī)制,可以很方法的得到當(dāng)前實(shí)例的屬性值

總結(jié)

Btrace能做的事情太多,但使用之前切記檢查腳本的可行性,一旦Btrace腳本侵入到系統(tǒng)中,只有通過重啟才能恢復(fù)。



作者:占小狼
鏈接:https://www.jianshu.com/p/dbb3a8b5c92f
來源:簡書
簡書著作權(quán)歸作者所有,任何形式的轉(zhuǎn)載都請聯(lián)系作者獲得授權(quán)并注明出處。

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的如何在生产环境使用Btrace进行调试的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。