写在前面
公司内arthas已经打在了每个容器中,推荐切换到启动java程序的用户之后使用 java -jar arthas-boot.jar
命令启动
如果启动有问题,可以尝试如下命令现场下载jar包启动
curl -O https://alibaba.github.io/arthas/arthas-boot.jar
java -jar arthas-boot.jar
更多使用方法详见arthas官方文档 https://alibaba.github.io/arthas/
推荐一篇入门级的比较通俗的博文:https://www.cnblogs.com/theRhyme/p/10659265.html
里头是最基础常用的命令,如sc
、sm
命令等
用法
从spring context里获取任意bean并调用其方法或查看成员变量
启动arthas并attach到进程后,执行tt
命令来记录RequestMappingHandlerAdapter#invokeHandlerMethod
的请求
tt -t org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter invokeHandlerMethod
然后随便访问该项目的一个地址,触发invokeHandlerMethod
,例如 wget http://10.0.0.23:8080/xxxserv
输出1
2
3
4
5
6
7
8$ 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
可以看到fragement的index为1000
之后输入tt -i 1000 -w 'target.getApplicationContext().getBean("baseExamService").fingerPrint2NewestState'
就可以得到名为baseExamService
这个bean了,之后可以像写代码一样继续调用方法或者查看成员变量的值
以上是最基本的监听某个函数的用法,其实tt命令还可以支持条件表达式,更精准地监听某个特定调用
tt
命令的官方详细说明:https://alibaba.github.io/arthas/tt.html
tt -i
命令用于查看调用信息,最常用的是查看输入参数params
、当前上下文target
、返回参数returnObj
,如下:
tt -i $index -w 'params'
tt -i $index -w 'target'
tt -i $index -w 'returnObj'