前言:
對線上的java服務, 往往采用日志進行問題處理和分析. 倘若日志缺乏相關的信息時, 那又該如何處理? 遠程調試會影響服務的正常工作, 修改代碼重新部署的方案其實時性和靈活性難以保證(線上服務的流程繁瑣, 問題追蹤的不確定性), 有沒有兩全的完美方案(不影響正常服務, 又靈活/無侵入性)呢?
答案是有, 它就是人見人愛, 花見花開的神器BTrace. 那BTrace究竟是這么樣的神器, 為何它只要998(啊呸..., -_-bbb). 好了, 讓我們一步一步的掀起它的紅蓋頭來. 本系列講述BTrace的使用/原理/技巧, 希望對大家有所幫助, 對自己也是種學習經歷.
本文着重講解Btrace的安裝, 原理和初步使用.
BTrace的原理篇:
BTrace的首字母B來自於bytecode, 某種程度上透露了其原理. 其能在不影響目標程序運行的前提下, 通過HotSpot虛擬機的HotSwap技術動態插入原本不存在的調試代碼, 其是基於了JDK 6的Instumentation來實現的. 具體的原理介紹, 可以參考博文: Btrace的基本原理.
BTrace的安裝:
BTrace的安裝有兩種方式.
1). VisualVM的插件形式存在
VisualVM的BTrace插件安裝, 通過其插件管理器來簡單安裝.
評注: 具體在VisualVM中: 工具->插件->可用插件, 選擇BTrace WorkBench安裝
2). 單獨的BTrace命令行工具
BTrace下載網址: https://kenai.com/projects/btrace/downloads/directory/releases
btrace-bin的目錄結構如下:
評注: bin為二進制/腳本目錄, docs是api文檔, samples包含btrace的各種例子和說明
BTrace的使用:
讓我們來構造一個簡單的java程序, 來作為測試程序.
public class Calculator { public int add(int a, int b) { return a + b; } public static void main(String[] args) { Scanner scanner = new Scanner(System.in); Calculator roboot = new Calculator(); while ( scanner.hasNext() ) { int a = scanner.nextInt(); int b = scanner.nextInt(); int c = roboot.add(a, b); System.out.println( String.format("%d + %d = %d", a, b, c)); } } }
評注: Calculator類的函數add用於a+b的計算, Scanner用於交互, 從命令行讀入輸入參數.
接着我們編寫一段BTrace代碼, 用於跟蹤Calculator類的add函數.
import com.sun.btrace.annotations.*; import static com.sun.btrace.BTraceUtils.*; @BTrace public class TracingScript { @OnMethod( clazz="mmxf.btrace.test.Calculator", method="add", location=@Location(Kind.RETURN) ) public static void func( int a, int b, @Return int result) { println("trace: ======================="); jstack(); println(strcat("a:", str(a))); println(strcat("b:", str(b))); println(strcat("result:", str(result))); } }
先借助VisualVM的BTrace插件來完成調試:
可從VisualVM獲取java的進程, 然后點擊Trace Application, 導入BTrace Script, 點擊運行即可.
結果如圖所示:
當然我們也可以借助btrace的命令行工具來實現:
1). 確定java進程的pid
可借助jps -l來實現
評注: 選取pid為7547的進程id為目標進程
2). 執行btrace命令
btrace <pid> <btrace_script>
評注:打印出了堆棧信息, 以及add方法的輸入參數以及函數返回結果
總結:
本文只是個開頭, 對btrace的安裝和使用有個初步的認識, 后續的文章會對btrace的概念, 用途和實戰例子進行講述. 敬請期待.