【工作技术栈】【arthas】arthas使用方式总结(诊断问题+方法执行)
这里写目录标题
- 前言
- 原使用文档
- 示例
- 查看某个对象中的所有成员变量
- 常见场景:
- 命令如下
- 原参考文档链接
- 查看某个静态类型的值
- 常见场景:
- 命令如下
- 原参考文档链接
- 简单观察某个函数的入参和返回值
- 常见场景:
- 命令如下
- 原参考文档链接
- 查看函数执行的路径
- 常见场景:
- 命令如下
- 原参考文档链接
- 查看这个方法从哪调用过来的
- 常见场景:
- 命令如下
- 原参考文档链接
- 执行一下某个方法
- 常见场景:
- 命令如下
- 原参考文档链接
- 写在后头
前言
这篇文章主要为了写给刚刚接触到arthas的同学和我自己,刚开始我看到arthas的简介时觉得这个插件实在是太厉害了,我一定要把这个技能学到熟练!这样线上和线下问题就不用再和别人抢占debug端口了!(当然我认为arthas也是一种硬核的问题排查,通常我认为系统应该具有良好的日志打点,能够在不符合预期的地方将关键信息打印出来,这样既能够加快软件的问题定位,还能够统计问题的影响面,比如从哪个业务方来的流量大概有多少量级,从而可以做出合理的决策)
那么这篇文章主要将我自己在排查问题的时候需要用到arthas时,但又不知道众多命令应该使用哪一个的时候最终总结出来的方法论,大家可以参考一下,如果还有更好的快速方便的排查命令一定要评论区at我添加进来!感谢各路大神!
原使用文档
https://arthas.aliyun.com/doc/commands.html
示例
查看某个对象中的所有成员变量
常见场景:
1、出现堆栈异常并且,异常中确定到某一行时,该行存在连续调用(也就是不知道哪个调用出现的问题)
2、需要查看springbean的注入情况和注入类型是否符合预期
命令如下
该命令暂时在命令生成工具中没有找到,所以这边我直接从文档中扒拉出来一份固定的命令格式,大家自行复制替换
vmtool --action getInstances --className <你的className全ref> --limit 10 --express ‘instances[0]’
这里limit如果你的对象下成员变量超过10个,这里可以加大limit值,就能看到你的对象的成员变量了
原参考文档链接
https://arthas.aliyun.com/doc/vmtool.html#%E6%89%A7%E8%A1%8C%E8%A1%A8%E8%BE%BE%E5%BC%8F
查看某个静态类型的值
常见场景:
1、某些类中存在static,在类被第一次load的时候会被执行,之后可能会被某处改变,此时需要看值是什么
命令如下
arthas idea插件生成
命令格式:
getstatic top.swzhao.project.workflow.common.contants.EngineConstants STR_JDBC_URL1 -x 3
top.swzhao.project.workflow.common.contants.EngineConstants STR_JDBC_URL1 替换为你的变量名全路径
原参考文档链接
top.swzhao.project.workflow.common.contants.EngineConstants STR_JDBC_URL1
简单观察某个函数的入参和返回值
常见场景:
1、函数的行为不符合预期并且没有日志打点的情况
2、如果能够确认问题出在某个函数的时候,可以直接观察该函数的返回值即可
命令如下
arthas idea插件生成:
命令示例:
watch top.swzhao.project.workflow.core.engineimpl.OmpFlowEngineImpl start ‘{params,returnObj,throwExp}’ -n 5 -x 3
top.swzhao.project.workflow.core.engineimpl.OmpFlowEngineImpl替换为你自己的类
start 替换为你自己的方法名
原参考文档链接
https://arthas.aliyun.com/doc/watch.html
查看函数执行的路径
常见场景:
1、程序员:wc 不应该啊?怎么可能走到这里?
2、这地方为啥为true?不能啊?我在做梦吗?
命令如下
使用idea arthas trace:能够跟踪函数的执行路径和每一行的执行明细
命令示例:
trace top.swzhao.project.workflow.core.engineimpl.OmpFlowEngineImpl start -n 5 --skipJDKMethod false
自行替换类名和方法名:
【类名】top.swzhao.project.workflow.core.engineimpl.OmpFlowEngineImpl 【方法名】start
原参考文档链接
https://arthas.aliyun.com/doc/trace.html
查看这个方法从哪调用过来的
常见场景:
1、出现一些熟悉的log但是,打印log的函数调用方非常多,不知道从哪里来的
命令如下
使用idea arthas trace:能够跟踪函数的执行路径和每一行的执行明细
命令示例:
stack top.swzhao.project.workflow.core.engineimpl.OmpFlowEngineImpl start -n 5
自行替换类名和方法名:
【类名】top.swzhao.project.workflow.core.engineimpl.OmpFlowEngineImpl 【方法名】start
原参考文档链接
https://arthas.aliyun.com/doc/stack.html
执行一下某个方法
常见场景:
1、这个方法我想查看一下
2、我想调用一下这个方法(理由。。我喜欢这个方法不行吗?:)dddd)
命令如下
这个命令的生成有点麻烦,主要有步骤如下:
1、获取方法所在类的classloader的hash值
命令: sc -d <你的类全称>
执行后找到关键字并复制:
2、使用插件,将hash值放入,用插件生成执行命令
3、在插件命令中填充方法入参
这里解释一下:
因为我的方法入参如下:
所以我这边需要填入tplId和一个map,大家后面需要根据自己的特点来定制自己的入参哈
4、在command中执行调用即可
原参考文档链接
https://arthas.aliyun.com/doc/sc.html#%E5%8F%82%E6%95%B0%E8%AF%B4%E6%98%8E
https://arthas.aliyun.com/doc/vmtool.html
写在后头
如果有更好的示例,麻烦按照如上格式邮箱给我,我会帮你添加上去~
2260755767@qq.com