当前位置: 首页 > news >正文

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 3watch org.dromara.report.service.impl.DataSourceServiceImpl testConnection "{params,returnObj,throwExp}" -n 5 -x 3
http://www.lryc.cn/news/473489.html

相关文章:

  • QT访问数据库:应用提示Driver not loaded
  • 支持ANC的头戴式蓝牙耳机,更有小金标认证,QCY H3 Pro体验
  • net framework 3.5组件更新失败错误代码0x80072f8f怎样解决
  • C语言初阶:十一.代码调试技巧
  • Jenkins Pipeline 部署总结
  • HTTP的初步了解
  • SM单元 硬件
  • 如何从CSV、JSON等格式创建DataFrame
  • Java避坑案例 - 线程池错误的混用引发的性能故障分析
  • 七种方法助你找到实用且免费的API服务
  • leetcode-74-搜索二维矩阵
  • 122.WEB渗透测试-信息收集-ARL(13)
  • 动态规划 —— 路径问题-下降路径最小和
  • 【Linux网络】TCP_Socket
  • NVR批量管理软件/平台EasyNVR多个NVR同时管理支持视频投放在电视墙上
  • Springboot集成阿里云通义千问(灵积模型)
  • 微信公众号(或微信浏览器)获取openId(网页授权)
  • C++算法第五天
  • 牛客网剑指Offer-树篇-JZ26 树的子结构
  • FFmpeg 4.3 音视频-多路H265监控录放C++开发六,使用SDLVSQT显示yuv文件
  • Spring 设计模式之适配器模式
  • 多传感器数字化分析系统
  • Java 基础教学:面向对象编程基础-封装、继承与多态
  • Ubuntu环境本地部署DbGate数据库管理工具并实现无公网IP远程访问
  • 【AI抠图整合包及教程】Meta SAM 2:视觉分割的革命性飞跃
  • 使用语言模型进行文本摘要的五个级别(llm)
  • ubuntu交叉编译libffi库给arm平台使用
  • 【jvm】空间分配担保策略
  • iQOO手机怎样将屏幕投射到MacBook?可以同步音频吗?
  • BUU usualCrypt1