工程师工具箱系列(3)Arthas

文章目录

    • 工程师工具箱系列(3)Arthas
      • 安装与准备
      • Arthas插件使用场景
        • 查看某个变量值
        • ognl方式调用Bean方法
        • tt(TimeTunel)方式调用Bean的方法
        • ognl调用带参数方法
      • 资源总览

工程师工具箱系列(3)Arthas

Java诊断利器

安装与准备

  • windows下推荐安装arthas,直接下载jar包
curl -O https://arthas.aliyun.com/arthas-boot.jar  //下载
java -jar arthas-boot.jar  //启动
  • linnx/mac下的推荐安装arthas,使用脚本as.sh脚本
curl -L https://arthas.aliyun.com/install.sh | sh

启动后arthas自动检测可以应用的程序:

要选择应用程序,输入对应的序号就行

dashboard命令示意:

  • 在idea中安装arthas插件:直接在应用市场中搜索arthas即可

使用的基本流程如下:

Arthas插件使用场景

启动arthas并已应用到应用程序

查看某个变量值

  • 静态变量的例子
    假设要获取下面这个static field变量值

首先选中这个变量,右键弹出菜单,然后选择Arthas Command一级菜单,再选择Ognl To Get Static Method Field二级菜单命令

成功后弹出以下窗口,点击copy sc command

获取到一个在命令行执行的命令: sc -d com.wangji92.arthas.plugin.demo.controller.StaticTest
复制到命令行下执行如下:1处是复制来要执行的命令,2处是得到的hashcode
![外在这里插入图片描述

复制hashcode到插件弹窗,填入输入框中,执行前最好先clean cache下,然后点击copy command,得到最终过的查询脚本语句:

ognl -x 3 '@com.wangji92.arthas.plugin.demo.controller.StaticTest@INVOKE_STATIC_NAME' -c 2dd83cd2

复制到命令窗口,输入后执行,得到变量当前的值

ognl方式调用Bean方法

SpringContext也是静态的,所以我们也能通过ognl命令来获取,获得了上下文容器后,可以调用Bean,基本可以为所欲为了。

获取的方式是通过:ApplicationObjectSupport#getApplicationContext

我们来尝试调动下CommonController这个Bean的getRandomInteger方法,拿到classload的hashcode后,采用下面的命令(这是ognl语法糖,不清楚也没关系,后面会介绍如何通过插件来达到同样效果):

ognl -x 3 '#springContext=@com.wangji92.arthas.plugin.demo.common.ApplicationContextProvider@context,#springContext.getBean("commonController").getRandomInteger()' -c 2dd83cd2

看到结果输出了一个随机数453

接下来我们尝试通过插件来完成同样的效果,在这之前,我们要先要把项目的SpringContext配置下
首先代码中要有能获取SpringContext的方法

然后把这个类的路径配置到插件的 Spring static Context Ognl setting
配置内容如下:

@com.wangji92.arthas.plugin.demo.common.ApplicationContextProvider@context

完成后我们选择commonController#getRandomInteger方法,按照下面顺序操作

得到下面弹窗,然后根据步骤1-4分别与命令行交替执行下,如果classloader没变,那直接执行第4步即可

观察第4步获得的命令,就是之前介绍的ognl语法糖

ognl -x 3 '#springContext=@com.wangji92.arthas.plugin.demo.common.ApplicationContextProvider@context,#springContext.getBean("commonController").getRandomInteger()' -c 2dd83cd2

再次执行,同样得到一个随机数,不过这次是240

PS:顺便说一嘴,插件提供了3种方式来调用Bean方法,先有个认知,其它方式具体的操作后续的章节再详细展开,包括带参数的如何调用

1 是通过静态的容器获取Bean进行调用(需要额外获取springContext的实现类比如:
ApplicationContextProvider)

2 是通过Watch方式进行调用(不需要额外实现类,单需要额外触发)

3 是通过tt的方式进行调用(不需要额外实现类,需要额外触发)

tt(TimeTunel)方式调用Bean的方法

同样是选中你要执行的方法,然后在菜单中选择tt方式,弹窗中非常明显的给出了执行的步骤

1 先copy command在后台执行

tt -t org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter invokeHandlerMethod -n 5

2 通过浏览器或Postman工具随便调用个接口额外触发下,后台会捕获请求引用,可以看到命令行后台的刷新了,看到了调用类以及方法名,这是属于第二步的工作

3 执行第三步,copy command得到:

tt -w 'target.getApplicationContext().getBean("commonController").getRandomInteger()' -x 3 -i 1000

粘贴到后台执行,可以看到调用正常,进行多次调用也没问题(watch的方式和tt类似,更加简单点就不演示了)

ognl调用带参数方法

等待被调用的方法,包含两个参数,一个是Integer,一个是List,前者是一个简单对象,后者属于复杂对象

按照示意图使用插件调用

通过插件,我们发现插件也只能提供简单参数的自动填充,而复杂对象需要我们自己去构造(参考对应文档)

完成后的命令如下:

ognl  -x  3  '#user=new com.wangji92.arthas.plugin.demo.controller.User(),#user.setName("wangji"),#user.setAge(27L),@com.wangji92.arthas.plugin.demo.controller.StaticTest@invokeStaticMethodParamObjListUser(0,{#user,#user})' -c 2dd83cd2拷贝到命令行中执行,可以得到一个调用结果

在这里插入图片描述

Arthas本身是一个非常强大的运维类工具,Arthas插件给我们提供了许多的方便,替代了我们去记忆很长的脚本语法。

要想灵活的使用它,你还需要完整的阅读官方文档,去了解下,本文就不做详述了,本文目的是入门,相信你看完后至少应该入门了。

插件支持的命令全景图:

文末是一些参考资料,值得你更加全面和深入的进行学习。

资源总览

  • Arthas文档地址:https://arthas.aliyun.com/doc/
  • B站视频:https://www.bilibili.com/video/BV1K7411Q7mW/
  • 语雀文档:https://www.yuque.com/docs/share/01217521-2fdb-4261-8904-ef6e20d4f5ea?#
  • 示例工程地址:https://github.com/WangJi92/arthas-plugin-demo
  • 扩展阅读博客:http://hengyunabc.github.io/
  • idea插件下载地址:https://plugins.jetbrains.com/plugin/13581-arthas-idea
  • 插件源码地址:https://github.com/WangJi92/arthas-idea-plugin

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/11545.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LabVIEW学习记录3 - 自定义函数

LabVIEW学习记录3 - 自定义函数 一、LabVIEW学习记录二、自定义函数及函数调用 一、LabVIEW学习记录 【labVIEW】学习记录LabVIEW学习记录2 - MySQL数据库连接与操作LabVIEW学习记录 - 实时显示时间LabVIEW学习记录4-局部变量、全局变量、共享变量 二、自定义函数及函数调用 …

C++入门-stack和queue(下)

大家好啊,在这先祝天下的母亲节日快乐啦!现在呢,给大家带来C中priority_queue和容器适配器的相关知识点 3.1 C 中的优先队列(priority_queue)介绍 优先队列(priority_queue)是一种特殊的队列…

洛谷 P6218 [USACO06NOV] Round Numbers S 题解 数位dp

[USACO06NOV] Round Numbers S 题目描述 如果一个正整数的二进制表示中, 0 0 0 的数目不小于 1 1 1 的数目,那么它就被称为「圆数」。 例如, 9 9 9 的二进制表示为 1001 1001 1001,其中有 2 2 2 个 0 0 0 与 2 2 2 个 1 …

Linux部署Heartbeat

环境信息: 10.1.13.75 master 10.1.13.140 slave 10.1.13.247 VIP 一,基础环境处理 1,修改主机名 master节点 hostnamectl set-hostname master slave节点 hostnamectl set-hostname slave 2,修改/etc/hosts vi /etc/hos…

transformer与beter

transformer与beter 解码和编码器含义tokizer标记器和one-hot独热编码编码解码--语义较好的维度空间矩阵相乘--空间变换编码理解如何构造降维的嵌入矩阵--实现到达潜空间上面是基础,下面是transformer正文自注意力机制注意力分数--上下文修正系数为什么需要KQ两个矩…

设计模式-07 设计模式-观察者模式(Observer Pattern)

设计模式-07 设计模式-观察者模式(Observer Pattern) 1.定义 观察者模式是一种软件设计模式,它定义了一种一对多的依赖关系,其中一个对象(称为“主题”)维护了一个依赖对象的列表(称为“观察者”…

ssm125四六级报名与成绩查询系统+jsp

四六级报名与成绩查询系统的设计与实现 摘 要 互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人们提供服务。针对四六级报名信息管理混乱&am…

达梦数据插入操作的深坑

提示错误:Only if specified in the column list and SET IDENTITY_INSERT is ON, then identity column could be assigned value 插入的语句采用缺省的方式实现,执行插入操作失败; 原因分析: 1.自增长的SQL表里面插入指定ID的…

DIFT:Emergent Correspondence from Image Diffusion # 论文阅读

URL https://arxiv.org/pdf/2306.03881 主页:https://diffusionfeatures.github.io/ 代码:https://github.com/Tsingularity/dift TD;DR 23 年 6月 cornell 大学的文章,任务是做图片的特征匹配(关联),特…

【kali工具使用】Tcpdump 抓包查看三次握手过程

Tcpdump 抓包查看三次握手过程 tcpdump 常用参数: -c 指定要抓取的数据包数量 -n 对 IP 地址以数字方式显式,否则显式为主机名 port 指定端口 -I 指定 tcpdump 需要监听的接口。默认会抓取第一个网络接口 tcp 1ClientSYN1seqx 2Server SYN1 seq…

树莓派|超声波传感器

VCC:超声波模块电源脚,接5V电源即可 Trig:超声波发送脚,高电平时发送出40KHZ出超声波 Echo:超声波接收检测脚,当接收到返回的超声波时,输出高电平 GND:超声波模块GND 测距原理&…

2025考研 | 北京师范大学计算机考研考情分析

北京师范大学(Beijing Normal University)简称“北师大”,由中华人民共和国教育部直属,中央直管副部级建制,位列“211工程”、“985工程”,入选国家“双一流”、“珠峰计划”、“2011计划”、“111计划”、…

--每周分享--

一、三数之和&#xff1a;15. 三数之和 - 力扣&#xff08;LeetCode&#xff09; public class Solution {public List<List<Integer>> threeSum(int[] nums) {List<List<Integer>> result new ArrayList<>();//判断极限条件&#xff1a;长度不…

NCL绘制WRF domain区域并添加气象站点

读取文件 根据官网例子Using gsn_csm_contour_map to plot WRF-ARW data绘制&#xff1a; ; It shows how to use gsn_csm_xxxx scripts to do the plotting. ; ; You can use the map projection settings on the WRF file, or you ; can use your own map projection. See …

路由器、交换机和网卡

大家使用VMware安装镜像之后&#xff0c;是不是都会考虑虚拟机的镜像系统怎么连上网的&#xff0c;它的连接方式是什么&#xff0c;它ip是什么&#xff1f; 路由器、交换机和网卡 1.路由器 一般有几个功能&#xff0c;第一个是网关、第二个是扩展有线网络端口、第三个是WiFi功…

ncs sdk nrf5340 运行DFU

nrf5340 运行DFU 1. dfu介绍 Nordic 的 DFU&#xff08;Device Firmware Update&#xff09;是一种用于更新设备固件的技术和协议。Nordic Semiconductor 是一家专门设计和制造无线芯片的公司&#xff0c;他们的产品主要用于物联网&#xff08;IoT&#xff09;和无线连接应用…

【数据分析面试】42.用户流失预测模型搭建(资料数据分享)

题目 保持高的客户留存率可以稳定和提到企业的收入。因此&#xff0c;预测和防止客户流失是在业务中常见的一项数据分析任务。这次分享的数据集包括了电信行业、银行、人力资源和电商行业&#xff0c;涵盖了不同业务背景下的流失预测数据。 后台回复暗号&#xff08;在本文末…

整理好了!2024年最常见 100 道 Java基础面试题(四十三)

上一篇地址&#xff1a;整理好了&#xff01;2024年最常见 100 道 Java基础面试题&#xff08;四十二&#xff09;-CSDN博客 八十五、Java 常用的元注解有哪些&#xff1f; 在Java中&#xff0c;元注解&#xff08;Meta-Annotation&#xff09;是指那些用于其他注解上的注解&…

React Native 之 开发环境搭建(一)

1. 安装Node.js&#xff1a; Node.js是React Native开发的基础&#xff0c;因此首先需要安装Node.js。强烈建议始终选择 Node 当前的 LTS &#xff08;长期维护&#xff09;版本&#xff0c;一般是偶数版本&#xff0c;不要选择偏实验性质的奇数版本。 如果你希望更方便地管理…

k8sCRD

k8s&&CRD 概念创建一个简单的自定义资源Operator 概念 CRD: CustomResourceDefinition&#xff0c;CustomResourceDefinition represents a resource that should be exposed on the API server. Its name MUST be in the format <.spec.name>.<.spec.group&…