Arthas调试线上代码技巧

1、Arthas概述


官网地址:https://arthas.aliyun.com/

下载地址:https://arthas.aliyun.com/arthas-boot.jar

使用教程:https://arthas.aliyun.com/doc/quick-start.html

Arthas(阿尔萨斯)是 Alibaba 开源的一款Java诊断工具,它能够在不修改应用程序代码的情况下,对业务问题进行定位和诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率。

image-20241031141808149

当你遇到以下类似问题而束手无策时,Arthas可以帮你解决:
    1. 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception2. 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
    3. 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
    4. 有什么办法可以监控到 JVM 的实时运行状态?
    5. 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
    6. 怎样直接从 JVM 内查找某个类的实例?
    7. 是否有一个全局视角来查看系统的运行状况?
    8. 怎么快速定位应用的热点,生成火焰图?
  
常用命令: 
  dashboard:查看实时数据面板
  dump: 将jvm运行的class字节码保存到指定目录(需要指定类的全限定名)
  jad: 将jvm运行的class字节码反编译成源码(需要指定类的全限定名)

2、下载&安装


# 下载arthas jar包
curl -O https://arthas.aliyun.com/arthas-boot.jar

# 启动arthas
java -jar arthas-boot.jar

image-20241020052121067


3、Arthas快速入门


1、在idea中运行我们的测试程序

package cn.z3inc.demo;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

/**
 * 死循环获取时间
 *
 * @author 白豆五
 * @date 2023/10/15
 * @since JDK8
 */
public class Demo {
    public static void main(String[] args) throws InterruptedException {
        while (true) {
            LocalDateTime now = LocalDateTime.now();  // 获取当前日期时间
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");// 配置时间格式
            String time = now.format(formatter); // 格式化时间
            System.out.println("当前时间:" + time);
            Thread.sleep(1000);
        }
    }
}

image-20241031142403820

2、以jar包方式启动arthas

java -jar arthas-boot.jar

image-20241031142422091

3、输入进程前面的编号,并按回车键,进入程序的内部

image-20241031142435566

4、使用dashboard命令,查看当前系统的实时数据面板

相关参数:

  • -i 刷新实时数据的时间间隔 (ms),默认是5000ms
  • -n 刷新实时数据的次数
# 查看当前系统的实时数据面板,每隔2秒刷新一次,只执行1次结束
dashboard -i 2000 -n 1

image-20241031142505028

5、使用dump命令,将class字节码保存到d盘(类名支持表达式匹配)

相关参数:

  • -d: 设置class文件的保存位置
  • -c:类所属 ClassLoader 的 hashcode
  • --classLoaderClass:指定执行表达式的 ClassLoader 的 class name
dump -d D:/jvm/data/ cn.z3inc.demo.Demo

image-20241031142523704

image-20241031142527909

6、使用jad命令,将运行中的字节码反编译成源码(全限定类名)

jad cn.z3inc.demo.Demo

image-20241031142551958

4、Arthas命令整理


文档:https://arthas.aliyun.com/doc/commands.html

4.1、查看实时面板

dashboard:当前系统的实时数据面

img


4.2、反编译代码

jad:反编译代码(将jvm中运行的class文件 => java代码)

//反编指定类:  jad 全限定类名  --lineNumber false ( --lineNumber false 不显示行号)
//反编指定类的方法:  jad 全限定类名 方法名  --lineNumber false ( --lineNumber false 不显示行号)
jad org.dromara.report.service.impl.DataSourceServiceImpl --lineNumber false
jad org.dromara.report.service.impl.DataSourceServiceImpl testConnection --lineNumber false

image-20241031144417836

4.3、监控方法执行

watch:监控方法的执行情况。可观测范围为:返回值抛出异常入参。通过编写 OGNL 表达式进行对应变量的查看。

watch 全限定类名 方法名 "{params,returnObj,throwExp}" -n 5 -x 3
  
  watch org.dromara.report.service.impl.DataSourceServiceImpl testConnection "{params,returnObj,throwExp}" -n 5 -x 3
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白豆五

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值