实操案例
排查函数调用异常
通过curl 请求接口只能看到返回异常,但是看不到具体的请求参数和堆栈信息。
shell@Alicloud:~$ curl http://localhost:61000/user/0
{"timestamp":1655435063042,"status":500,"error":"Internal Server Error","exception":"java.lang.IllegalArgumentException","message":"id < 1","path":"/user/0"}
查看UserController的 参数/异常
在Arthas里执行:
watch com.example.demo.arthas.user.UserController * '{params, throwExp}'
- 第一个参数是类名,支持通配
- 第二个参数是函数名,支持通配 访问 curl ,watch命令会打印调用的参数和异常
再次通过curl 调用可以在arthas里面查看到具体的异常信息。
把获取到的结果展开,可以用-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}'
条件表达式
watch命令支持在第4个参数里写条件表达式,比如: 当访问 user/1 时,watch命令没有输出 当访问 user/101 时,watch会打印出结果。
当异常时捕获
watch命令支持-e选项,表示只捕获抛出异常时的请求:
watch com.example.demo.arthas.user.UserC