文章目录
Arthas线上问题定位工具使用
当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决:
这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
1.安装
curl -O https://arthas.aliyun.com/arthas-boot.jar
2.启动
java -jar arthas-boot.jar
输入编号进入指定项目
3.反编译源码
jad com.xxxx.web.manager.boot.PartnerWebManagerApplication
4.查看方法入参,返回值
4.1查看返回值
watch com.xxx.web.manager.controller.ad.config.AdConfigController list returnObj
4.2查看返回值属性遍历深度
watch com.xxx.web.manager.controller.ad.config.AdConfigController list returnObj -x 3
4.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的请求
参数名称 | 参数说明 |
---|---|
b | 在方法调用之前观察 |
e | 在方法异常之后观察 |
s | 在方法返回之后观察 |
f | (默认)在方法结束之后(正常返回和异常返回)观察 |
E | 开启正则表达式匹配,默认为通配符匹配 |
x | 指定输出结果的属性遍历深度,默认为 1 |
观察表达式和条件表达式可以使用ognl表达式
5.查看方法调用路径及响应时间
5.1方法内部调用路径
trace com.xxx.web.manager.controller.ad.config.AdConfigController list
5.2方法被调用路径
stack com.xxx.service.basic.ad.config.service.impl.AdConfigServiceImpl pageList
6.记录下指定方法每次调用的入参和返回信息
6.1记录信息
tt -t com.xxx.service.basic.ad.config.service.impl.AdConfigServiceImpl pageList
6.2查看保存的方法调用列表
tt -l
根据条件搜索
tt -s 'method.name=="pageList"'
6.3查看某一次调用的信息
tt -i 1003 -x3
7.不重启服务器,动态修改代码(添加日志)
java的方法存在方法区内,方法区里面的数据是类加载时从class文件中提取出来的,所以我们可以直接修改class文件并替换,达到热更新的目的
7.1 修改代码,编译成class文件
将class 文件上传到服务器某个目录下面,然后执行 retransform命令
再次调用修改后的接口,就会打印出新加的日志
8.查看类是从那个jar包执行
使用sc -d 命令
不要光看,还是跟着操作一下最好。说不定什么时候就用上了