百万级高并发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