线上项目调试工具-Arthas

文章目录

    • 前言
      • Arthas 是什么?
      • Arthas 能够做什么?
    • 安装
    • 初步使用
      • 启动正常 Java 项目
      • 启动 Arthas 服务
      • Arthas 追加日志案例
        • help 查看帮助命令
        • jad 反编译
        • retransform 替换 Class 文件
        • 恢复(消除影响)
    • Arthas 整合 Spring Boot
      • maven 依赖
      • 配置属性
      • 下载部署arthas tunnel server
      • 启动项目,连接到 Arthas

前言

Arthas 是什么?

Arthas(阿尔萨斯)是Alibaba开源的Java诊断工具,深受开发者喜爱。

Arthas 能够做什么?

当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决:

  1. 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
  2. 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
  3. 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
  4. 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
  5. 是否有一个全局视角来查看系统的运行状况?
  6. 有什么办法可以监控到JVM的实时运行状态?
  7. 怎么快速定位应用的热点,生成火焰图?
  8. 怎样直接从JVM内查找某个类的实例?

Arthas支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 Tab 自动补全功能,进一步方便进行问题的定位和诊断。

安装

前面说了 Arthas 是阿里开源的 Java 诊断工具,所以它是一个项目,可以打成 jar 包部署在服务器运行。

下面我就以 window 上运行 jar 包为例进行演示。

(安装我们就省略,直接从官网下载 jar 包进行使用即可)

Linux 安装可以参考官网:https://arthas.aliyun.com/doc/install-detail.html

初步使用

启动正常 Java 项目

命令:$ java -jar xxx.jar

线上项目调试工具-Arthas_第1张图片

启动 Arthas 服务

$ java -jar arthas-boot.jar

线上项目调试工具-Arthas_第2张图片

可以看到我们启动的 demo-test.jar Java 项目,前面有个 index 标识 4;所以我们输入 4 + Enter 即可指向我们要操作的项目。

线上项目调试工具-Arthas_第3张图片

启动成功,arthas 提供一个web操作界面,在游览器地址栏输入:127.0.0.1:3658即可打开。

线上项目调试工具-Arthas_第4张图片

至此,我们准备工作就已完成,接下来我们就在这个 Web 界面进行命令操作。

Arthas 追加日志案例

基础命令

help 查看帮助命令

线上项目调试工具-Arthas_第5张图片

可以看到,Arthas 提供的命令非常多,功能也非常强大;可以对 JVM 的运行进行管理、可以查看 stack 虚拟机栈等等。

jad 反编译

使用这个命令能够将 .class 字节码文件,反编译成我们源代码;一般用于查看 JVM 加载执行的类,是否是我们所期望的类。

命令:jad 类全路径类名

如:jad com.cqeec.demo.controller.DemoController

线上项目调试工具-Arthas_第6张图片

可以看出,我们在代码中 System.out.println("--111--")这段话,那我们在游览器进行请求这个控制方法。

http://localhost:12323/demo/test

线上项目调试工具-Arthas_第7张图片

已经输出成功。

那假如我们在线项目出了错,但是这个项目是正式环境运行着的项目,不能停,但是我怀疑变量的数据有问题,所以需要修改代码追加日志怎么办?

能够想到的就是本地修改源代码,追加日志,然后重新发版;这样太繁琐了,所以 Arthas 就是来干这个事儿的。—— 在不停止项目的情况下,手动替换 JVM 中的 .Class 文件,达到修改代码的功能。

retransform 替换 Class 文件

作用:加载外部的.class文件,retransform(重新转换) jvm已加载的类。

  1. 首先需要准备一个修改代码后的 .Class 文件。

        @GetMapping("/test")
        public void test() {
            // 原先代码给注释掉
    		//        System.out.println("---------111----------");
    
            // 新增代码
            String name = "zhangSan";
            System.out.println(name);
        }
    
  2. 利用 IDEA 将修改后的 .java 文件编译为字节码文件

    线上项目调试工具-Arthas_第8张图片

  3. 使用 retransform 命令进行字节码文件的替换

    寻找编译后的字节码文件

    线上项目调试工具-Arthas_第9张图片

    替换操作说明

    命令:$ retransform 编译后的字节码文件地址

    例如:$ retransform D:/code/demo-test/target/classes/com/cqeec/demo/controller/DemoController.class

    注意:必须是正斜杠才能识别。

  4. 执行命令

    1622942932748

    成功,我们再次游览器启动控制方法,看输出结果是否为 zhangSan

    线上项目调试工具-Arthas_第10张图片

    成功! (注意我们全程没有重启 demo-test.jar 服务)

以上我们追加日志就成功了。

恢复(消除影响)

  1. 删除指定 retransform entry(条目)

    • 查看 Class 更换 entry

      $ retransform -l 这个是小写的 L

      线上项目调试工具-Arthas_第11张图片

    • 删除 entry

      单个删除:$ retransform -d 1 (1:代表 entryID)

      删除全部:$ retransform --deleteAll

  2. 显式触发 retransform

    删除所有 entry 之后,重新加载被修改的类

    命令:$ retransform --classPattern 类的全路径类名

    线上项目调试工具-Arthas_第12张图片

    再次游览器请求,查看输出结果。

    线上项目调试工具-Arthas_第13张图片

恢复了!

以上就是追加日志的全过程!

Arthas 整合 Spring Boot

只支持 spring boot 2

maven 依赖

<dependency>
    <groupId>com.taobao.arthasgroupId>
    <artifactId>arthas-spring-boot-starterartifactId>
    <version>3.5.1version>
dependency>

配置属性

# arthas配置
arthas:
  # arthas连接ID
  agent-id: demo-test
  # atthas 服务连接地址
  tunnel-server: ws://127.0.0.1:7777/ws

默认情况下,arthas tunnel server的web端口是8080,arthas agent连接的端口是7777

下载部署arthas tunnel server

从Github Releases页下载: https://github.com/alibaba/arthas/releases

下载后直接启动:$ java -jar arthas-tunnel-server-3.5.1-fatjar.jar

启动项目,连接到 Arthas

这里就直接使用 IDEA 启动了(要达成 jar 包启动也可以的)

项目启动后,打开 Arthas 提供的 Web 界面:http://127.0.0.1:8080/,使用项目中配置的 agent-id,将 Arthas 连接到服务。

线上项目调试工具-Arthas_第14张图片

连接成功。

这样我们只需要在服务器部署一个 arthas-tunnel-server-3.5.1-fatjar.jar,就可以很方便的支持多个 Java 服务的 Arthas 调试了。

自此,使用 Arthas 追加日志就已经实现;Arthas 还有很多强大之处,慢慢探索!

技术来源于生活!

你可能感兴趣的:(第三方工具,java,alibaba,开发工具)