Arthas實踐–獲取到SpringContext,然後為所欲為
背景
Arthas 是Alibaba開源的Java診斷工具,深受開發者喜愛。
Arthas提供了非常豐富的關於呼叫攔截的命令,比如 trace/watch/monitor/tt 。但是很多時候我們在排查問題時,需要更多的線索,並不只是函式的引數和返回值。
比如在一個spring應用裡,想獲取到spring context裡的其它bean。如果能隨意獲取到spring bean,那就可以“為所欲為”了。
下面介紹如何利用Arthas獲取到spring context。
Demo: https://github.com/hengyunabc/spring-boot-inside/tree/master/demo-arthas-spring-boot
Arthas快速開始:https://alibaba.github.io/arthas/quick-start.html
使用tt命令獲取到spring context
Demo是一個spring mvc應用,請求會經過一系列的spring bean處理,那麼我們可以在spring mvc的類裡攔截到一些請求。
啟動Demo: mvn spring-boot:run
使用Arthas Attach成功之後,執行tt
命令來記錄RequestMappingHandlerAdapter#invokeHandlerMethod
的請求
tt -t org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter invokeHandlerMethod
然後訪問一個網頁: http://localhost:8080/
可以看到Arthas會攔截到這個呼叫,index是1000,並且列印出:
$ watch com.example.demo.Test * `params[0]@sss`
$ tt -t org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter invokeHandlerMethod
Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 101 ms.
INDEX TIMESTAMP COST(ms IS-RE IS-EX OBJECT CLASS METHOD
) T P
------------------------------------------------------------------------------------------------------------------
1000 2019-01-27 16:31 3.66744 true false 0x4465cf70 RequestMappingHandlerAda invokeHandlerMethod
:54 pter
那麼怎樣獲取到spring context?
可以用tt
命令的-i
引數來指定index,並且用-w
引數來執行ognl表示式來獲取spring context:
$ tt -i 1000 -w `target.getApplicationContext()`
@AnnotationConfigEmbeddedWebApplicationContext[
reader=@AnnotatedBeanDefinitionReader[org.springframework.context.annotation.AnnotatedBeanDefinitionReader@35dc90ec],
scanner=@ClassPathBeanDefinitionScanner[org.springframework.context.annotation.ClassPathBeanDefinitionScanner@72078a14],
annotatedClasses=null,
basePackages=null,
]
Affect(row-cnt:1) cost in 7 ms.
從spring context裡獲取任意bean
獲取到spring context之後,就可以獲取到任意的bean了,比如獲取到helloWorldService
,並呼叫getHelloMessage()
函式:
$ tt -i 1000 -w `target.getApplicationContext().getBean("helloWorldService").getHelloMessage()`
@String[Hello World]
Affect(row-cnt:1) cost in 5 ms.
更多的思路
在很多程式碼裡都有static函式或者static holder類,順滕摸瓜,可以獲取很多其它的物件。比如在Dubbo裡通過SpringExtensionFactory
獲取spring context:
$ ognl `#context=@com.alibaba.dubbo.config.spring.extension.SpringExtensionFactory@contexts.iterator.next,
#context.getBean("userServiceImpl").findUser(1)`
@User[
id=@Integer[1],
name=@String[Deanna Borer],
]
連結
- Arthas: https://github.com/alibaba/arthas
- https://alibaba.github.io/arthas/tt.html
- https://alibaba.github.io/arthas/ognl.html
相關文章
- Arthas實踐–獲取到Spring Context,然後為所欲為SpringContext
- 在程式設計中為所欲為[聖誕版]程式設計
- 為什麼要學習Python?因為能「為所欲為」啊……Python
- 《天外世界》開發者:為了讓玩家為所欲為,我們絞盡了腦汁
- 我所認為的RESTful API最佳實踐RESTAPI
- 抱歉,Xposed真的可以為所欲為——1.基礎知識儲備
- 懂編譯真的可以為所欲為|不同前端框架下的程式碼轉換編譯前端框架
- 用指令管理vue滾動狀態以及滾動條復原,讓你為所欲為。Vue
- 我所理解的Arthas
- 中原銀行 Arthas 實踐之路
- UIWebView攔截圖片請求,SDWebImage下載快取到本地,然後從本地讀取到UIWebView中UIWebView快取
- java獲取到heapdump檔案後,如何快速分析?Java
- [問題貼] 如何解決獲取到的 toast 的文字為空的問題?AST
- 執行 phpunit 之後 request 無法獲取到引數PHP
- 做re不小心噶瞭然後轉生成為pwn高手
- 當DUBBO遇上Arthas - 排查問題的實踐
- 實戰:dockerfile 最小實踐——koa 為例Docker
- 我認為的 Runloop 最佳實踐OOP
- Spring Boot Admin 整合診斷利器 Arthas 實踐Spring Boot
- Arthas 實踐——生產環境排查 CPU 飈高問題
- 為什麼在容器中 1 號程式掛不上 arthas?
- 獲取最後修改時間為今天的檔案
- 【Azure Developer】如何透過Azure Portal快速獲取到對應操作的API並轉換為Python程式碼DeveloperAPIPython
- Arthas實踐–使用redefine排查應用奇怪的日誌來源
- 乾貨分享!JAVA診斷工具Arthas在Rainbond上實踐~JavaAI
- InnoDB,5項最佳實踐,知其所以然?
- Python將字串轉為字典最佳實踐Python字串
- 短視訊商城系統,手機獲取到驗證碼後自動填入
- 試試哈然後
- SpringBoot Admin2.0 整合 Java 診斷神器 Arthas 實踐Spring BootJava
- Arthas實踐–快速排查SpringBoot應用404/401問題Spring Boot
- 蘋果欲為iOS 12加入數字健康功能 模仿安卓9.0?蘋果iOS安卓
- “以資料為中心”的數安實踐感悟
- Google:內容為王,跨屏為後Go
- 面試官所認為的單例模式面試單例模式
- 為什麼物件是大勢所趨?物件
- 隨機獲取到的高質量圖片隨機
- 如何在 vuex action 中獲取到 vue 例項Vue