场景1 记录请求时间和次数
生产环境一定要加 -n 参数,不然会打满jvm
- [arthas@8868]$ tt -t org.fyh.arthas.controller.ProgressController test -n 5
- Press Q or Ctrl+C to abort.
- Affect(class count: 1 , method count: 1) cost in 99 ms, listenerId: 1
- INDEX TIMESTAMP COST(ms) IS-RET IS-EXP OBJECT CLASS METHOD
- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
- 1000 2022-09-20 16:21:06 617.5923 true false 0x2fdd5af4 ProgressController test
- 1001 2022-09-20 16:21:10 417.3191 true false 0x2fdd5af4 ProgressController test
tt 命令记录2次请求,IS-RET=是否return, IS-EXP=是否exception,
场景2 模拟内部发起请求
利用时空隧道重复执行,-i是上面的index, 相当是请求的镜像,包含了入参数,这个时候可以使用应用打印日志来判断是否重复执行成功
模拟index为1000的调用
- [arthas@8868]$ tt -i 1000 -p
- RE-INDEX 1000
- GMT-REPLAY 2022-09-20 16:21:42
- OBJECT 0x2fdd5af4
- CLASS org.fyh.arthas.controller.ProgressController
- METHOD test
- PARAMETERS[0] @Integer[2]
- IS-RETURN true
- IS-EXCEPTION false
- COST(ms) 613.1518
- RETURN-OBJ @ApiResult[
- code=@Integer[200],
- msg=@String[OK],
- data=null,
- ]
- Time fragment[1000] successfully replayed 1 times.
模拟index为1001的调用
- [arthas@8868]$ tt -i 1001 -p
- RE-INDEX 1001
- GMT-REPLAY 2022-09-20 16:21:57
- OBJECT 0x2fdd5af4
- CLASS org.fyh.arthas.controller.ProgressController
- METHOD test
- PARAMETERS[0] @Integer[3]
- IS-RETURN true
- IS-EXCEPTION false
- COST(ms) 401.6286
- RETURN-OBJ @ApiResult[
- code=@Integer[200],
- msg=@String[OK],
- data=null,
- ]
场景3 获取到Spring Context,然后为所欲为,任意执行对象和方法
执行tt命令来记录RequestMappingHandlerAdapter#invokeHandlerMethod的请求
- 1. tt -t org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter invokeHandlerMethod
- 2. tt -i 1000 -w 'target.getApplicationContext()'
- 3. tt -i 1002 -w 'target.getApplicationContext().getBean("xxxServiceImpl").xxx()' 触发指定方法执行
备注1:因为我们是SpringMVC应用,所有请求都会被RequestMappingHandlerAdapter拦截
备注2:Arthas会把当前执行的对象放到target变量中;所以是‘target.getApplicationContext()’
备注3:一定要使用 #1 先监听这个类的方法调用,才可以获取#2 获取context