Arthas源码解析:
首先是arthas的工程结构:
arthas-agent:javaagent包,需要将此包与被监控程序通过javaagent一起启动,也可以通过虚拟机loadagent来植入增强代码
arthas-boot:arthas启动主程序,arthas推荐的启动方式
arthas-client:telnet连接工程
arthas-client:arthas核心包,里面也有主方法可以启动arthas
arthas-spy:间谍程序,该包由启动类加载器加载,其他工程包由arthas自定义类加载器加载
一、从arthas-core中的Arthas看起:
1.Arthas.java中的主方法是启动方法,会执行到attachAgent(),我们从这个方法看起,这里的configure中有参数为被监控程序的pid
拿到pid后通过VirtualMachine.attach来链接到目标虚拟机
2.连接到虚拟机后判断jdk版本,设置agent包路径,然后通过 virtualMachine.loadAgent(agent包路径, 参数)来远程加载agent,
这里的参数会传到preagent方法中的args中。
二、对目标虚拟机执行loadagent后,目标虚拟机会加载agent程序,通过绝对路径找到arthas-agent包,执行agentmain方法(如果通过-javaagent
参数进行增强,则是执行premain方法),方法最终执行main方法,main方法主要执行了一些初始化工作
1.首先通过传入参数找到agentjar和spyjar,通过Instrumention的appendToBootstrapClassLoaderSearch方法将spyjar加入到被监控程序的
启动类加载器搜索路径中,然后定义自己的类加载器,加载agentjar(这里的agentjar就是arthas-core包)
2.接着初始化间谍程序,通过自定义的classloader找到com.taobao.arthas.core.advisor.AdviceWeaver类,然后获取它的methodOnBegin,
methodOnReturnEnd,methodOnThrowingEnd...等方法,然后将他们植入(赋值)给spy,之后就是新启一个现成来进行绑定操作
3.绑定操作最终执行的是com.taobao.arthas.core.server.ArthasBootstrap的bind方法,首先通过相关的配置,参数对ShellServerImpl进行
初始化,接着设置预置命令BuiltinCommandPack,后面是两种监听方式,一种是telnet,一种是http也就是websocket,最后有一行
//监听
shellServer.listen(new BindHandler(isBindRef));就是注册监听器了。我们来看telnet的TelnetTermServer中有一个listen方法,这里就是监听命令了
4.最后执行UserStatUtil.arthasStart();这只是一个统计,可以不用管
三、接下来就是监听命令以及处理命令了
1.在 shellServer.listen(new BindHandler(isBindRef))中,可以看到初始化了一个TermServerListenHandler,初始化后赋值给TermServer,
方法内部通过启动一个netty telnet端口来进行监听,Helper.loadKeymap()这个方法主要是在项目目录inputrc文件里加载对应的快捷键以及对应的
处理类name标识,返回个映射对象,对命令行界面快捷键指示处理需要。
2.new TermImpl构造方法中,首先静态对象readlineFunctions是所有的Function接口的子类,Helper.loadServices方法里面的 ServiceLoader.load
其实就是根据META-INF下的Servides文件夹下的文件来读取实现类,接着实现DefaultTermStdinHandler,EventHandler以及对应的赋值,结合term
框架可以对相应的快捷键进行处理
3.回到TermServer.listen方法中,有初始化实例TermServerTermHandler ,启动监听后的termhandler.handle方法,就是该实例的hanle方法,
而该handler中的handle方法执行了handleTerm,这里对session进行了初始化,包括欢迎语,然后readline就是等待用户输入了,
4.当用户输入help时, 最中会调用ShellLineHandler.handle方法,这里做了前置的文件检查及解析,help命令顺利到了createjob这一步,一层层的封装,
然后创建实例化CommandProcess,这里要注意的是,找到command对应的processhandler赋值给ProcessImpl的属性了,这里就埋下伏笔,为后面路由
找到HelpCommand具体流程:createJob() -> createProcess() -> getCommand() 创建完job后,对job启动
这里启动后的执行流程为 job.run() -> process.run(foreground) -> ArthasBootstrap.getInstance().execute(task)(这里的task是关键
Runnable task = new CommandProcessTask(process); 最后调用的是CommandProcessTask的run方法) ->handler.handle(process)(这里的handler
是processhandler) -> process() ->instance.process(process)(这里的instance就是具体的命令实现了)
四、详细命令解析
--后续补充
相关推荐
深入学习Arthas源码,可以帮助我们理解其工作原理,提高解决线上问题的能力,同时也可借鉴其设计思路,提升自己的编程技能。对于熟悉Git的同学,可以将源码克隆到本地,进行代码阅读和修改,从而更深入地学习Arthas...
本项目深入解析并应用了阿里巴巴开源的Java诊断工具Arthas的设计源码,涉及1228个文件,涵盖653个Java源文件、159个Markdown文档、151个PNG图片、74个Vue文件、28个XML文件、26个JPG图片、22个JavaScript文件、18个...
该项目深入解析了基于Java语言的Arthas诊断工具的设计原理,并对其源码进行了详尽分析。项目包含共计463个文件,涵盖268个Java源文件、92个Markdown文档、44个PNG图片、14个XML文件、5个Shell脚本、4个JPG图片、3个...
arthas-3.1.0源码,Arthas 是Alibaba开源的Java诊断工具,支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 Tab 自动补全功能,方便进行问题的定位和诊断
Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等...
当你遇到以下类似问题而束手无策时, Arthas 可以帮助你解决: 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? 遇到问题无法在线...
4. **代码热更新**:利用`@update`命令,开发者可以在线修改类的源码,并实时生效,无需重启应用,大大缩短了调试周期。 5. **类与方法的检索**:插件集成了Arthas的`sc`和`find`命令,可以快速查询和定位项目中的...
该项目深入解析了基于阿里巴巴的Java诊断工具Arthas的源码,包含1793个文件,涵盖843个Markdown文档、571个Java源代码文件、128个PNG图片、117个JSON文件、24个XML配置文件、22个JPG图片、17个JavaScript文件、9个...
在内网环境下执行java -jar arthas-boot.jar 提示某些地址需要连网才可以访问。此时可以使用离线安装的方式。 1. 上传并解压缩 unzip arthas 至环境所需的目录 2. 运行 install-local.sh 安装成功后即可使用
**Arthas:线上热部署与项目在线诊断** Arthas是阿里巴巴开源的一款强大的Java诊断工具,它提供了丰富的命令行接口,帮助开发者在不重启应用的情况下进行问题定位、性能分析和资源监控。Arthas的核心功能包括但不...
Arthas是一款强大的Java诊断工具,由阿里巴巴开源并维护,旨在帮助开发者解决线上问题、进行生产环境调优。离线版的Arthas是专为无法连接到互联网的环境设计的,用户可以在下载后直接在本地使用,无需依赖外部网络。...
Arthas是一款强大的Java诊断工具,它可以帮助开发者在运行时检查和修改应用程序的状态,而无需重启服务。在IntelliJ IDEA这个流行的Java集成开发环境中,Arthas可以通过插件的形式集成,极大地提升了开发者的问题...
阿里Arthas是一款由阿里巴巴开源的Java诊断工具,它提供了丰富的命令行操作,帮助开发者在不重启服务的情况下,对线上Java应用进行问题定位和诊断。Arthas 3.1.0版本的离线文档包含了官方提供的详细使用指南,便于...
Linux上的Arthas安装教程详解 Arthas是一款由阿里巴巴开源的Java诊断工具,专为开发者设计,旨在解决生产环境中遇到的Java应用程序故障和性能问题。通过实时监控、丰富的命令行工具、可视化界面以及动态代码修改等...
Arthas是一款强大的Java诊断工具,它为开发者提供了一系列实用的功能,用于解决生产环境中常见的问题,如:查看方法调用关系、监控系统运行状态、分析内存占用等。这个压缩包"arthas-bin.zip"包含了Arthas的命令行...
Arthas是一款强大的Java应用程序诊断和监控工具,由Alibaba开源。它提供了丰富的命令行工具,帮助开发者在运行时分析和解决各种问题。这个压缩包包含Arthas的全量安装文件,允许用户全面地使用其功能。让我们逐一...
Java 诊断利器 Arthas 排查问题实践 Arthas 是 Alibaba 开源的 Java 诊断工具,于 2018 年 9 月开源,目前在 Github 上获得了 11,000 多个星标。 Arthas 的主要功能特性包括查看类加载情况、反编译类、热更新类、...
Arthas是一款强大的Java诊断工具,由Alibaba开源并维护,它提供了丰富的命令集合,用于帮助开发者在运行时分析和解决各种问题。标题中的"arthas-packaging-3.5.0-bin.zip"指的是Arthas的3.5.0版本的二进制打包文件,...
通过阅读源码,我们可以学习到如何利用Java的反射、动态代理、ASM字节码操作等技术来实现这样的诊断工具。 总之,Arthas是一个强大且全面的Java诊断工具,它为开发者提供了强大的现场诊断能力,无需重启应用即可...
阿里Java诊断工具Arthas是一款由阿里巴巴开源的高效、便捷的命令行工具,它专为了解决Java开发者在日常开发过程中遇到的各种问题而设计。Arthas提供了多种实用功能,如查看类信息、方法调用链、监控内存、分析线程、...