Arthas 是如何实现的

早在去年便用过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是一个非常优秀的线上故障排查工具。其中的每一个功能都值得去深挖,笔者限于水平,只能大致写写。

猜你喜欢

转载自juejin.im/post/5ee9d42ae51d4573de3b2cf2
今日推荐