早在去年便用过Arthas。近日无事,刚好来学习一下Arthas的实现。构建时遇到几个错误,这里简单纪录下
io.termd.core.term.TokenMgrError: Lexical error at line 2, column 50. Encountered: "\n" (10), after : ""
构建机器需为Linux;Win10之前的可以安装一个虚拟机,Win10目前已支持 WSL,通过系统自带的Store可以直接安装一个Ubuntu的子系统。或者使用Docker下载一个Java编译环境的镜像来进行构建。笔者使用的是虚拟机。
maven编译报错报 .git directory is not found!
POM中指定了git-commit-id插件,移除该插件或者从GitHub把仓库Down下来
arthas分为多个module,包括agent, boot, core, client, bytekit, common, memorycompiler, packaging, site, spy, tunnel-client, tunnel-server。
下面是Arthas启动时涉及到模块的执行流程
在BuiltinCommandPack中列举了所有的命令,并在ArthasBootstrap注册进ShellServerImpl中。因此看Arthas只要找到对应命令的处理器即可。所有的命令都继承于AnnotatedCommand,并通过一些注解将命令参数选项等装配至属性中。
- sc 依赖于 Instrumentation::getAllLoadedClasses 获取应用上下文中的所有class对象
- sm 同sc,获取到class对象后再通过反射获取方法签名
- jad 先获取到class对象,然后通过Instrumentation::addTransformer和Instrumentation::retransformClasses获取到对应class的定义。最后通过工具cfr进行反编译
- thread 通过Thread静态方法获取所有线程
- monitor, trace, stack, watch, tt 基于ObjectWeb ASM动态进行类的增强
- mc 通过javax.tools.JavaCompiler来编译Java源文件
- redfine 基于 Instrumentation::redefineClasses 实现
- heapdump 基于 HotSpotDiagnosticMXBean::dumpHeap 实现
Arthas是一个非常优秀的线上故障排查工具。其中的每一个功能都值得去深挖,笔者限于水平,只能大致写写。