百万级高并发 WebRTC 流媒体服务器设计与开发内附文档源码
下载地址:百度网盘
Java 诊断工具 Arthas- 实操案例
实操案例
排查函数调用异样
通过 curl 请求接口只能看到返回异样,然而看不到具体的请求参数和堆栈信息。
shell@Alicloud:~$ curl
{“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}’
复制代码
第一个参数是类名,反对通配
第二个参数是函数名,反对通配 拜访 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.UserController * “{params[0],throwExp}” -e
复制代码
按照耗时进行过滤
watch 命令反对按请求耗时进行过滤,比如:
watch com.example.demo.arthas.user.UserController * ‘{params, returnObj}’ ‘#cost>200’
复制代码
热更新代码
这个也是真的秀。
拜访 http://localhost:61000/user/0,会返回 500 异样:
shell@Alicloud:~$ curl http://localhost:61000/user/0
{“timestamp”:1655436218020,”status”:500,”error”:”Internal Server Error”,”exception”:”java.lang.IllegalArgumentException”,”message”:”id < 1″,”path”:”/user/0″}
复制代码
通过热更新代码,修改这个逻辑。
jad 反编译 UserController
jad –source-only com.example.demo.arthas.user.UserController > /tmp/UserController.java
复制代码
jad 反编译的后果保存在 /tmp/UserController.java 文件里了。
再打开一个 Terminal 窗口,而后用 vim 来编辑 /tmp/UserController.java:
vim /tmp/UserController.java