在线分析诊断⼯具Arthas
简介
Arthas 是Alibaba开源的Java诊断⼯具。
当你遇到以下类似问题⽽束⼿⽆策时,Arthas可以帮助你解决:
这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
我改的代码为什么没有执⾏到?难道是我没 commit?分⽀搞错了?
遇到问题⽆法在线上 debug,难道只能通过加⽇志再重新发布吗?
线上遇到某个⽤户的数据处理有问题,但线上同样⽆法 debug,线下⽆法重现!
是否有⼀个全局视⾓来查看系统的运⾏状况?
有什么办法可以监控到JVM的实时运⾏状态?
================
以上是Arthas官⽅介绍。
Arthas提供了热更新线上代码功能,在线上部署Arthas是⽐较危险,会破坏线上代码的版本管理。所以,不建议在线上环境部署Arthas。但是可以在测试环境部署,⽤于测试环境的debug。其实各种IDE⼯具也提供了远程断点功能,使⽤IDE⼯具远程断点功能,需要满⾜以下条件:
以debug模式启动java虚拟机
保证本地代码和测试环境运⾏代码版本⼀致
本地开发环境与测试环境⽹络是通的
使⽤IDE进⾏断点并不能完全模拟测试环境,毕竟是部署的是两套系统,依赖包,环境可能会有不同。
安装
Arthas有多种安装⽅式,下⾯⽅式安装⽐较简单。
最新版本,点击下载:arthas
解压后,在⽂件夹⾥有arthas-boot.jar
直接⽤java -jar的⽅式启动:
java -jar arthas-boot.jar
在线代码运行器Arthas启动会列出本地除了⾃⼰本⾝之外启动的jvm进程
以下就以MyPaasGatewayApplication为例,介绍Artthas部分功能使⽤。使⽤
选择jvm进程列表对应的序号,连接到需要debug的jvm,这⾥选择编号为1的jvm
回车后进⼊所选jvm对应的命令⾏界⾯。
输⼊help看⼀下帮助。
可以看到arthas⽀持查询classloader,thread,jvm,dashboard,sysprop,sysenv等信息。
也⽀持使⽤jad反编译类,使⽤mc编译类,使⽤redefine重新加载类。
使⽤dashboard查看当前jvm概要信息。
可以看到当前jvm线程状况,memory使⽤状况的信息。
在调试代码的过程中,查看变量值的和更新字节码这两个功能⽤得多⼀些,下⾯以MyPaasGatewayApplication为例⼦演⽰⼀下如何使⽤arthas 查看变量值和更新字节码。
查看变量值
在MyPaasGatewayApplication的实现中,有⼀个过滤器实现BuryPointFilter⽤于检查请求是否需要发送埋点信息,如果埋点信息开关开启,则发送埋点信息。代码如下:
假设测试环境没有开启debug lever log,或者懒得搜索⽇志,这⾥就可以⽤arthas的watch来观察shouldFilter⽅法的返回值。
watch后⾯接的参数为:
1.被观察对象的类名
2.被观察的⽅法
3.⽅法的返回值
可以看到输出
result=@Boolean[true]
表⽰shouldFilter返回的值是true.
更新字节码
⼿动禁掉BuryPointFilter,修改shouldFilter函数,总是返回false.
获取反编译代码
使⽤jad命令反编译类。
得到以下代码:
修改反编译出来的代码,改变shouldFilter的值,并打印log,log设置为warn级别,⽅便观察字节码修改结果。
查加载BuryPointFilter的ClassLoader
⽣成的字节码要包含原来类加载器的信息,所以要到BuryPointFilter是由jvm中哪个classLoader加载的。使⽤sc(search class)命令搜索classLoader信息.
-d 参数表⽰搜索详细信息(detail)
得到classLoader信息后,就可以⽣成带classLoader信息的字节码了。
⽣成代码修改后的字节码
使⽤mc(memory compiler)命令⽣成字节码
-c 参数指定classLoader
-d 参数指定⽣成后的字节码位置
redefine热更新代码
使⽤redefine重新加载新编译好的.class
这⾥没有重启jvm,发⼀个请求检验更新字节码是否⽣效
可以看到打印了新增的⽇志。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论