系列
- Arthas入门篇
- Arthas功能介绍
- Arthas 启动过程分析
- Arthas使用Idea调试
- Arthas Command处理流程
- Arthas类查找和反编译原理
- Arthas内存动态编译原理
- Arthas动态重新加载类
- Arthas导出加载类
开篇
- 这篇文章主要主要参考了Arthas issue整理的针对Arthas核心模块arthas-core和arthas-agent的调试方法,针对源码阅读来说只要掌握调试方法,基本上代码就没有任何秘密可言了。
- Arthas的调试基本上都得靠远程调试,所以启动参数需要携带-agentlib:jdwp参数来实现远程调试。
- Arthas的版本arthas-all-3.5.0版本。
启动流程图
- arthas-boot和as.sh作为启动的入口负责启动arthas-core。
- arthas-core负责绑定arthas-agent到指定的jvm。
- arthas-agent通过arthas-spy实现字节码绑定。
arthas-core调试
- 步骤一:启动arthas-demo的MathGame服务。
lebron374$ jps
2872 Launcher
2873 MathGame
- 步骤二:通过jps命令查看MathGame的进程id号。
java
-agentlib:jdwp=transport=dt_socket,address=8888,server=y,suspend=y
-Djava.awt.headless=true
-Xbootclasspath/a:/Library/Java/JavaVirtualMachines/jdk1.8.0_191.jdk/Contents/Home/jre/../lib/tools.jar
-jar /Users/lebron374/.arthas/lib/3.5.0/arthas/arthas-core.jar
-pid 2599
-core /Users/lebron374/.arthas/lib/3.5.0/arthas/arthas-core.jar
-agent /Users/lebron374/.arthas/lib/3.5.0/arthas/arthas-agent.jar
- 步骤三:通过java -jar命令启动arthas-core,启动命令里面的路径根据自己环境确定。可以通过com.taobao.arthas.boot.ProcessUtils#startArthasCore打断点获取参数。
- 步骤四:通过IDEA的remote绑定远程调试的端口。
- 步骤五:在com.taobao.arthas.core.Arthas#main打断点,执行步骤四的服务的debug功能。
arthas-agent调试
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=8000
- 步骤一:启动arthas-demo的MathGame服务,启动参数里面添加如上内容。
- 步骤二:IDEA添加远程调试指定步骤一的监听端口,开启远程调试功能。
- 步骤三:在com.taobao.arthas.agent334.AgentBootstrap#agentmain进行断点。
lebron374$ jps
2872 Launcher
2873 MathGame
[INFO] Found existing java process, please choose one
* [1]: 4068 org.jetbrains.jps.cmdline.Launcher
[2]: 4020 demo.MathGame
[3]: 358
3
[INFO] arthas home: /Users/lebron374/.arthas/lib/3.5.0/arthas
[INFO] Try to attach process 4191
[INFO] Attach process 4191 success.
[INFO] arthas-client connect 127.0.0.1 3658
- 步骤四:启动arthas-boot的main函数,选择jps结果中的demo.MathGame方法。