其他分享
首页 > 其他分享> > arthas

arthas

作者:互联网

案例: 排查函数调用异常(watch)

现象
访问 http://localhost:61000/user/0 ,会返回500异常:
在Arthas里执行(进行监控)

watch com.example.demo.arthas.user.UserController * '{params, throwExp}' -x 2

当发送请求时,就会打印日志信息;可以查看到具体的报错信息
返回值表达式
在上面的例子里,第三个参数是返回值表达式,它实际上是一个ognl表达式,它支持一些内置对象:
loader
clazz
method
target
params
returnObj
throwExp
isBefore
isThrow
isReturn
watch命令参考文档
watch命令支持在第4个参数里写条件表达式,比如:

watch com.example.demo.arthas.user.UserController * returnObj 'params[0] > 100'

当访问 user/1 时,watch命令没有输出

当访问 user/101 时,watch会打印出结果。

watch命令支持按抛出异常进行过滤

watch com.example.demo.arthas.user.UserController * "{params[0],throwExp}" -e

watch命令支持按请求耗时进行过滤,比如:

watch com.example.demo.arthas.user.UserController * '{params, returnObj}' '#cost>200'

案例: 热更新代码(jad/mc/redefine)

  1. jad命令反编译UserController
 jad --source-only com.example.demo.arthas.user.UserController > /tmp/UserController.java
  1. 修改代码
  2. sc命令查找加载具体类(UserController)的具体ClassLoader,使用此类加载器重新编译加载代码
 sc -d *UserController | grep classLoaderHash
 classLoaderHash   1be6f5c3

请记下你的classLoaderHash,后面需要使用它。在这里,它是 1be6f5c3。

  1. 使用mc(Memory Compiler)命令来编译,并且通过-c或者–classLoaderClass参数指定ClassLoader
mc --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader /tmp/UserController.java -d /tmp
Memory compiler output:
/tmp/com/example/demo/arthas/user/UserController.class
Affect(row-cnt:1) cost in 346 ms

也可以通过mc -c /tmp/UserController.java -d /tmp,使用-c参数指定ClassLoaderHash:

mc -c 1be6f5c3 /tmp/UserController.java -d /tmp
  1. 再使用redefine命令重新加载新编译好的UserController.class:
$ redefine /tmp/com/example/demo/arthas/user/UserController.class
redefine success, size: 1

标签:tmp,watch,user,arthas,UserController,com
来源: https://blog.csdn.net/qq_40656540/article/details/117324255