生产环境的 bug 开发环境无法复现怎么办?关键位置没有打印日志信息不足怎么办? 虽然我们上次定义了异常和日志的规范,但是改造的过程总是循序渐进的,可能会有漏网之鱼
help
在arthas交互环境中,可以输入help命令,然后会出现所有arthas支持的命令
如果不知道命令的用法,可以输入相应的命令后加参数--help,比如可以看一下jad命令的用法
thread
列出线程的信息, 这个命令会把所有线程按照cpu占用率从高到低列出来,如果线程太多,可以通过-n参数指定输出的行数,并输出线程当前时刻的堆栈信息
如看到某线程占用率过高,可以使用 thread pid 来输出其堆栈信息
还可以用thread -b定位死锁,当然jstack也可以
[arthas@26982]$ thread -b
No most blocking thread found!
dashboard
用dashboard命令来动态查看运行情况全览
如果内容使用率在不断上升,而且gc后也不下降,后面还发现gc越来越频繁,很可能就是内存泄漏了。
这个时候我们可以直接用heapdump命令把内存快照dump出来,作用和jmap工具一样
根据接口请求定位Controller
我们一步步来,我们现在使用的SpringBoot本质还是Servlet应用,只不过SpringMVC使用了DispatcherServlet为请求建立统一入口,分发到各handler中,可以先跟踪一下Servlet
trace javax.servlet.Servlet *
实际分发到handler的是DispatherServlet的doDispathch方法,使用jad进行反编译查看代码
jad org.springframework.web.servlet.DispatcherServlet doDispatch
实际在mappedHandler = getHandler(processedRequest);得到了处理请求的handler 所以直接拿到 getHandler函数的返回结果就可以知道当前处理请求的controller
watch org.springframework.web.servlet.DispatcherServlet getHandler returnObj
可以直接定位到对应的handler与方法,想看方法内容可以使用jad进行反编译
Watch
从发现问题,到定位接口,该watch上场了 watch以方法为目标,显示输入参数和返回值,让你可以像本地单步调试一样,跟踪到每一步的执行结果和获取当前的变量数值。以前要定位线上问题,信息不足就需要加日志打印,定位问题,可能需要反复重启应用。用了 Arthas,根本不需要加日志打印,重启应用这些操作
CHCP 65001
watch命令以方法为参数
watch cn.com.topsec.ti.assetmanage.controller.AccountController listSecDomByCondition -x 3 -b
-x 表示遍历深度,可以调整来打印具体的参数和结果内容,默认值是 1
-b 表示观察方法调用前