java动态追踪,线上问题怎么办?Arthas!!!
作者:互联网
场景
java动态追踪
线上问题怎么办?
0 看日志
1 没日志?远程debug
2 线上允许开放debug端口?review看代码
3 终极解决:arthas
Arthas使用
准备工作 启动项目,下载arthas
下载arthas
wget https://arthas.aliyun.com/arthas-boot.jar;
使用
1.启动arthas
wget https://arthas.aliyun.com/arthas-boot.jar;java -jar arthas-boot.jar
2 arthas-boot
是Arthas
的启动程序,它启动后,会列出所有的Java进程,用户可以选择需要诊断的目标进程。选择第一个进程,输入 1
,再Enter/回车
Attach成功之后,会打印Arthas LOGO。输入 help
可以获取到更多的帮助信息。
3 通过watch
命令可以查看函数的参数/返回值/异常信息。
wath 要监听的方法的reference路径 primeFactors returnObj
watch demo.MathGame primeFactors returnObj
可以jad命令反编译代码
jad demo.MathGame
4 退出Arthas
用 exit
或者 quit
命令可以退出Arthas。
案例:排查函数异常
查看UserController的 参数/异常
在Arthas里执行:
watch com.example.demo.arthas.user.UserController * '{params, throwExp}'
第一个参数是类名,支持通配
第二个参数是函数名,支持通配 访问 curl http://localhost:61000/user/0
,watch
命令会打印调用的参数和异常
如果想把获取到的结果展开,可以用-x
参数:
watch com.example.demo.arthas.user.UserController * '{params, throwExp}' -x 2
返回值表达式
在上面的例子里,第三个参数是返回值表达式
,它实际上是一个ognl
表达式,它支持一些内置对象:
- loader
- clazz
- method
- target
- params
- returnObj
- throwExp
- isBefore
- isThrow
- isReturn
你可以利用这些内置对象来组成不同的表达式。比如返回一个数组:
watch com.example.demo.arthas.user.UserController * '{params[0], target, returnObj}'
更多参考: https://arthas.aliyun.com/doc/advice-class.html
watch
命令支持-e
选项,表示只捕获抛出异常时的请求:
watch com.example.demo.arthas.user.UserController * "{params[0],throwExp}" -e
按照耗时进行过滤
watch命令支持按请求耗时进行过滤,比如:
watch com.example.demo.arthas.user.UserController * '{params, returnObj}' '#cost>200'
练习地址:https://start.aliyun.com/handson/qDlgqpBT/arthas-advanced-cn
标签:java,demo,Arthas,watch,线上,arthas,UserController,com 来源: https://blog.csdn.net/Connie1451/article/details/115405251