Arathas今天我就不多介绍了,算是一个项目管理工具吧。
小编所在的公司最近引进了这个工具,所以在实际的项目现场中使用到了这个东西,接下来就来说说使用它之后的各种爽吧!
相信大家在接手一个自己不熟悉的模块进行改bug时,多多少少都有一些头疼,因为模块不熟悉、所有在有报错的情况下很难去快速精准的定位问题所在。
此时‘Arthas’的重要性就凸显了出来,显示Debug神器!
下面我就结合一下我在工作中现场部署的项目出现问题后,从:接手到bug->使用Arthas排查bug->定位bug分析问题所在 。
那么就开始放图了:
当时我第一次看到这种只有两行报错信息的日志时,内心多少有些崩溃,这也太少的信息量了吧!让我根本无从适应,当时的我,脑子里面想到第一解决问题的方案就是 去看代码,看代码中是哪一行报了这个错误,但是当我把代码拉下来,大概看了几分钟之后,我发现我错了,因为这个模块调用了好几个其他模块的接口,你说说,这不是难为人嘛!于是我又拉了一个模块下来,接着看,看完之后发现这样好像不对,仔细一想好像也太不对了,放着有’Arthas’这种工具不用,跑去读代码,是’Arthas’它不香嘛?
于是我马上给现场用上了’Arthas’,当时用上的时候就开始让我犯难了,命令那么多!我应该去使用哪个命令去排查问题呢?
首先对于这种报错信息极少且不知道具体是哪一行或者是哪几行代码出错的情况下,建议使用:trace命令,trace命令不仅可以看到代码执行行的耗时情况,同时在报错时也会给出对应的错误提示信息。
例:[arthas@32326]$ trace 类路径 方法名 -v -n 5 --skipJDKMethod false '1==1’
补充:‘#cost’ 方法执行耗时
举例:trace *StringUtils isBlank '#cost>100’表示当执行时间超过100ms的时候,才会输出trace的结果
就比如这个,每个节点的响应时间,如果报错后的提示信息都显示得清清楚楚。。
还有一种情况是对于代码中的报错位置清楚后,只是不清楚是哪一种情况下引起的错误,这个时候可以通过调用方法的入参和出参的方式进行分析,这里则推荐使用 watch 方法执行数据观测,能观察到的范围为:返回值、抛出异常、入参,通过编写 OGNL 表达式进行对应变量的查看。核对变量是否有差,如果无差的话就再次使用 trace 命令查看它内部执行了哪一行的代码报的错,直到最终把问题定位。
例:watch命令:[arthas@32326]$ watch 类路径 方法名 ‘{params,returnObj,throwExp}’ -v -n 5 -x 3 '1==1’
参数说明:-x表示遍历深度,可以调整来打印具体的参数和结果内容,默认值是1。
-x 3 观察方法具体的返回参数
另外再补充一个命令: jad 反编译指定已加载类的源码
例:jad --source-only 类路径
这个方法可以把JVM 中实际运行的 class 的 byte code 反编译成 java 代码,这个方法对于我来说具体的实际应用场景还有待发现。。。