如何通过arthas在运行时执行代码

写在前面

公司内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

里头是最基础常用的命令,如scsm命令等

用法

从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'