当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决:
这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
安装
curl -O https://arthas.aliyun.com/arthas-boot.jar
输入编号进入指定项目, 如13
反编译
jad com.xxxx.web.manager.boot.PartnerWebManagerApplication
查看方法入参,返回值
watch com.xxx.web.manager.controller.ad.config.AdConfigController list returnObj
查看返回值属性遍历深度
watch com.xxx.web.manager.controller.ad.config.AdConfigController list returnObj -x 3
同时观察入参和出参
watch com.xxx.web.manager.controller.ad.config.AdConfigController list {params,returnObj} -x 3
可以使用ongl条件表达式过滤指定的请求
watch com.xxx.web.manager.controller.ad.config.AdConfigController list "{params[0],target}" "params[0]<0"
获取第一个参数,并且条件满足后面的条件
watch com.xxx.web.manager.controller.ad.config.AdConfigController list "{params[0],target}"
'{params, returnObj}' '#cost>200'
只查看耗时大于200ms的请求
观察表达式和条件表达式可以使用ognl表达式
查看方法调用路径及响应时间
trace com.xxx.web.manager.controller.ad.config.AdConfigController list
方法被调用路径
stack com.xxx.service.basic.ad.config.service.impl.AdConfigServiceImpl pageList
记录下指定方法每次调用的入参和返回信息
tt -t com.xxx.service.basic.ad.config.service.impl.AdConfigServiceImpl pageList
查看保存的方法调用列表
tt -l
根据条件搜索
tt -s 'method.name=="pageList"'
查看某一次调用的信息
tt -i 1003 -x3
不重启服务器,动态修改代码(添加日志)
java的方法存在方法区内,方法区里面的数据是类加载时从class文件中提取出来的,所以我们可以直接修改class文件并替换,达到热更新的目的
修改代码,编译成class文件
将class 文件上传到服务器某个目录下面,然后执行 retransform命令
再次调用修改后的接口,就会打印出新加的日志
查看类是从那个jar包执行
使用sc -d 命令