iarthas
前陣子對阿爾薩斯的原理進行一點探究,對它的原理總結整理如下:通過仿寫一個簡易版的阿爾薩斯,來加深對它的認識。
i_arthas 是模仿阿里開源的阿爾薩斯寫的小工具。整體技術上採用 Java agent 對字節碼的加載進 行攔截干涉,利用 ASM/ASM Byte Viewer 實現目標類字節碼的加強,通過 Java attach 實現不同 虛擬機進程間的通信,做到了虛擬機層面上的 AOP。
整體實現了簡易版的 redefine(熱替換)、 watch(方法監控)、trace(方法鏈路追蹤)、timeTunnel(流量採集與回放)等功能。
代碼上傳至github : https://github.com/CallMeJiaGu/iarthas
實現思路
阿爾薩斯 原理探究 仿寫arthas-TimeTunnel 流量採集
大體效果
timetunnel 流量採集:
2
1
-------------------
開始採集方法:doAdd
2
開始採集方法:doDelet
1
-------------------
watch 方法監控
4
1
-------------------
監控當前方法:doAdd
入參:
參數類型-- int@1
參數類型-- String@abc
參數類型-- long@11
參數類型-- Lagent/Job;@agent.Job@7adf9f5f
參數類型-- Lagent/Main;@agent.Main@85ede7b
參數類型-- [email protected]
出參:
參數類型-- int@4
4
1
-------------------
trace 方法子調用鏈路追蹤
3
1
-------------------
doAdd
-|javalangThread@sleep
--|method Cost: 1000.0282599999999 ms
-|agentJob@test
--|method Cost: 1000.0648309999999 ms
almost time cost:
--|method Cost: 2005.3643539999998 ms
3
1
-------------------
redefine 熱加載
Hello World!
Bye Bye
-------------------
Hello World!
Bye Bye
-------------------
Hello World!
Bye Bye
fix good Bye!!