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

Arthas常见使用姿势

文章目录

  • Arthas常见使用姿势
    • 官网
    • 基本命令
    • 通用参数解释
    • 表达式核心变量说明
    • 常用命令
    • 一些常用特殊案例举例
    • 其他技巧
    • 关于OGNL
    • OGNL的常见使用
    • OGNL的一些特殊用法与说明
    • OGNL内置的虚拟属性
    • OGNL的个人思考
    • OGNL的杂碎,收集未做验证

Arthas常见使用姿势

官网

https://arthas.aliyun.com/doc/

基本命令

java -jar arthas-boot.jar

通用参数解释

-n 限制打印的条数,如程序执行中,可能有些方法会疯狂打印。
-i 设置打印间隔时间,单位毫秒
-x 属性遍历深度,默认为1。

表达式核心变量说明

public class Advice {private final ClassLoader loader;private final Class<?> clazz;private final ArthasMethod method;private final Object target;private final Object[] params;private final Object returnObj;private final Throwable throwExp;private final boolean isBefore;private final boolean isThrow;private final boolean isReturn;
} 
变量名变量解释
loader本次调用类所在的 ClassLoader
clazz本次调用类的 Class 引用
method本次调用方法反射引用
target本次调用类的实例
params本次调用参数列表,这是一个数组,如果方法是无参方法则为空数组
returnObj本次调用返回的对象。当且仅当 isReturn==true 成立时候有效,表明方法调用是以正常返回的方式结束。如果当前方法无返回值 void,则值为 null
throwExp本次调用抛出的异常。当且仅当 isThrow==true 成立时有效,表明方法调用是以抛出异常的方式结束。
isBefore辅助判断标记,当前的通知节点有可能是在方法一开始就通知,此时 isBeforetrue 成立,同时 isThrowfalse 和 isReturn==false,因为在方法刚开始时,还无法确定方法调用将会如何结束。
isThrow辅助判断标记,当前的方法调用以抛异常的形式结束。
isReturn辅助判断标记,当前的方法调用以正常返回的形式结束。

默认对象,即未设置观察表达式时的默认表达式

{params, target, returnObj}

常用命令

# ognlognl '@java.lang.System@out.println("hello")'# watchwatch demo.MathGame primeFactors -x 2# 默认观察 {params, target, returnObj}# tracetrace java.util.Collections sort -n 5 --skipJDKMethod false# 重载使用watch Test hello params 'params[0].class.name=="java.lang.Integer"'watch Test hello params 'params.length==2&&returnObj instanceof java.lang.String'# stack 输出当前方法被调用的调用路径stack site.tkgup.Demo test  -n 5 # vmtoolvmtool --action getInstances --className site.tkgup.HelloWorld --express "instances[0].container" -x 3# jad 反编译器(java decompiler java),可做些热替换操作jad --source-only com.example.Demo > /tmp/Demo.java# 1、jad得到原文件jad site.tkgup.Demo# 2、使用vi/vim修改# 3、使用 mc 进行编译mc /tmp/Demo.java# 4、使用 redefine/retransform 进行加载redefine /tmp/Demo.class

一些常用特殊案例举例

#1、观察 函数调用 返回时watch demo.MathGame primeFactors -x 2# -x 表示遍历深度,可以调整来打印具体的参数和结果内容,默认值是1# 观察表达式,默认值是{params, target, returnObj}#2、观察 函数调用 入口时watch demo.MathGame primeFactors "{params,returnObj}" -x 2 -b#3、同时观察 函数调用 入口时和返回后watch demo.MathGame primeFactors "{params,target,returnObj}" -x 2 -b -s -n 2# -n 2,表示只执行两次#4、条件表达式watch demo.MathGame primeFactors "{params[0],target}" "params[0]<0"#5、观察异常信息watch demo.MathGame primeFactors "{params[0],throwExp}" -e -x 2# -e 表示抛出异常时才触发#6、按照耗时进行过滤watch demo.MathGame primeFactors '{params, returnObj}' '#cost>200' -x 2# #cost>200(单位是ms)表示只有当耗时大于200ms时才会输出,过滤掉执行时间小于200ms的调用# watch/stack/trace这个三个命令都支持#cost# 表示当执行时间超过100ms的时候,才会输出trace的结果:trace *StringUtils isBlank '#cost>100'#7、观察当前对象中的属性watch demo.MathGame primeFactors 'target.illegalArgumentCount'#8、获取类的静态字段、调用类的静态函数watch demo.MathGame * '{params,@demo.MathGame@random.nextInt(100)}' -v -n 1 -x 2# -v 参数打印更多信息,watch/trace/monitor/stack/tt 命令都支持 -v 参数# 使用-v选项,会打印Condition express的具体值和执行结果,方便确认。watch -v -x 2 demo.MathGame print 'params' 'params[0] > 100000'#9、比较枚举值watch demo.MathGame run 'params[0]==@demo.Outer$Inner@ONE' -x 2#10、排除掉指定的类watch javax.servlet.Filter * --exclude-class-pattern com.demo.TestFilter# --exclude-class-pattern 参数可以排除掉指定的类,watch/trace/monitor/stack/tt 命令都支持#11、访问静态变量# 在watch命令中访问,会受到classloader的限制,不推荐使用:watch com.taobao.container.Test test "@com.taobao.container.Test@m"# 用新版getstatic命令,通过-c指定classloader,可查看任意static变量,同时支持ognl表达式处理getstatic com.alibaba.arthas.Test n 'entrySet().iterator.{? #this.key.name()=="STOP"}'#12、调用静态方法watch com.taobao.container.Test test "@java.lang.Thread@currentThread().getContextClassLoader()"#13、按条件过滤:watch com.taobao.container.Test test "{params}" "params[0].{? #this.name == "tkg"}.size()>0" -x 2#14、匹配线程&正则多个类多个方法trace -E 'nio\.Thread|test\.Executor' 'select|runAllTasks' '@Thread@currentThread().getName().contains("tkg-thre")&&#cost>500'#15、调用构造函数watch demo.Test test '(#test=new java.util.ArrayList(), #test.add("abc"), #test)' -n 1watch demo.MathGame <init> '{params,returnObj,throwExp}' -v#16、访问Map中的元素watch demo.Test test '@demo.Test@map.keys' -n 1# ongl针对Map接口提供了keys, values这两个虚拟属性,可以像普通属性一样访问watch demo.Test test '@demo.Test@map.get(@demo.TypeEnum@valueOf("RUN"))' -n 1watch Test test '@Test@n.entrySet().iterator.{? #this.key.name() == "RUN"}' -n 1

其他技巧

&			后台运行,可 ctrl + z 挂起
jobs		查看后台(arthas)执行的任务
fg job-id	后台任务转前台
bg job-id	前台任务转后台
kill		停止异步执行的命令

关于OGNL

可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。它使用相同的表达式去存取对象的属性。Ognl类:This class provides static methods for parsing and interpreting OGNL expressions.根据官方解释,这个类是提供一些静态方法去解析表达式。
OgnlContext:This class defines the execution context for an OGNL expression.该类定义OGNL表达式的执行上下文。
public class OgnlContext extends Object implements Map {}OgnlContext类实现了Map接口,所以它也是一个Map,可以通过put方法往该上下文环境中放元素。该上下文环境中,有两种对象:根对象和普通对象。我们可以使用它的setRoot方法设置根对象。根对象只能有一个,而普通对象则可以有多个。因为它实现了java.utils.Map 的接口。OgnlContext(ognl上下文)=根对象(1个)+非根对象(n个),非根对象要通过"#key"访问,根对象可以省略"#key"格式,只能为"#root"。
获取根对象的属性值,可以直接使用属性名作为表达式,也可以使用#对象名.属性名的方式;获取普通对象的属性值,则必须使用#对象名.属性名的方式获取。(可以将普通对象设置为根对象,但只能有一个根对象,后面设置的根对象会覆盖前面的根对象

OGNL的常见使用

1)  支持对象方法调用,属性取值赋值:如xxx.doSomeSpecial(),"age=18"(操作根)
2)  支持类静态的方法|值调用:格式为 "@[类全名(包括包路径)]@[方法名|值名]" ,如:@java.lang.String@format('foo%s','bar')--调用类静态方法@java.lang.Thread$State@RUNNABLE  --访问内部类枚举值@java.lang.Thread@class  --访问class对象(#obj.getClass())@tutorial.MyConstant@APP_NAME--访问类的静态值
3)  支持赋值操作和表达式串联,如:price=100,discount=0.8,calculatePrice()
4)  访问OGNL上下文 (OGNL context)和ActionContext
5)  对于OGNL来说,数组与集合操作一样,获取数组、集合对象,如:#users[1]
6)  操作map对象,如:#users['tkg']
7)  可以使用 || && !
8)  null可以直接使用,如 "#obj.do(null, new site.tkg.Boy(18))"
9)  链式调用 "#obj.do(null, (#boy=new site.tkg.Boy(18),#boy.setAge(18),#boy))"
10) 访问外部类对象  target.this$0

OGNL的一些特殊用法与说明

过滤:
? --获取集合中所有满足选择逻辑的对象
^ --获取集合中第一个满足选择逻辑的对象
$ --获取集合中最后一个满足选择逻辑的对象使用注意:
1.创建集合不用加#,创建map要加#
2.创建类的一个对象,要使用类的完整路径
3.要创建带有初始化值的指定类型的List或Map,可以这样#@java.util.TreeMap@{‘key’:’value’,’key’:’value’,……}

OGNL内置的虚拟属性

CollectionListMapSetIteratorEnumeration
size
isEmpty
size
iterator
size
keys
values
size
iterator
next
hasNext
next
hasNext
nextElement
hasMoreElements

OGNL的个人思考

request, #request.username都可以访问原因推测:根对象有相应属性,上下文对象同时做了保存书写转换问题:
watch site.tkgup.Demo traceE '{params,returnObj,throwExp}' -n 5 -x 3 'params[0]=="name"'params.{#this[0]=='name'}
watch site.tkgup.Demo test '{params,returnObj,throwExp}' -n 5 -x 3 'throwExp != null'throwExp.{#this != null}

OGNL的杂碎,收集未做验证

OGNL中的#、%和$符号
#用法a. 访问非根对象属性,如:#session.userNameb. 用于引用当前对象,进行方法调用等,集合搭配(?、^、$)进行过滤、映射过滤:persons.{?#this.age>20}映射:persons.{name}过滤是取行的操作,而投影是取列的操作在使用过滤操作时,使用#this,用于代表当前正在迭代的集合中的对象,当前元素c. 构造Map,如:#{'foo1':'bar1', 'foo2':'bar2'}$用法:a. 在国际化资源文件中,引用OGNL表达式reg.agerange=国际化资源信息:年龄必须在${min}同${max}之间b. 在Struts 2框架的配置文件中引用OGNL表达式<validators><field name="intb"><field-validator type="int"><param name="min">10</param><param name="max">100</param><message>数字必须为${min}为${max}之间!</message></field-validator></field></validators>%用法(不像是OGNL的操作符)%符号的用途是在标志的属性为字符串类型时,计算OGNL表达式的值如:<h3>构造Map</h3><s:set name="foobar" value="#{'foo1':'bar1', 'foo2':'bar2'}"/><p>The value of key "foo1" is <s:property value="#foobar['foo1']"/></p><p>不用%:<s:url value="#foobar['foo1']"/></p><p>使用%:<s:url value="%{#foobar['foo1']}"/></p>结果:he value of key "foo1" is bar1不使用%:#foobar['foo1']使用%:bar1Struts2标签库 属性值中的%与#号的关系:
1)如果标签的属性值是OGNL表达式,那么无需加上%{}。 
2)如果标签的属性值是字符串类型,那么在字符串当中凡是出现的%{}都会被解析成OGNL表达式,解析完毕后再与其他的字符串进行拼接构造出最后的字符串值。 
3)我们可以在所有的属性值上加%{},这样如果该属性值是OGNL表达式,那么标签处理类就会将%{}忽略掉

相关文章:

Arthas常见使用姿势

文章目录 Arthas常见使用姿势官网基本命令通用参数解释表达式核心变量说明常用命令一些常用特殊案例举例其他技巧关于OGNLOGNL的常见使用OGNL的一些特殊用法与说明OGNL内置的虚拟属性OGNL的个人思考OGNL的杂碎&#xff0c;收集未做验证 Arthas常见使用姿势 官网 https://arth…...

Apache Kylin的入门学习

Apache Kylin的入门学习可以从以下几个方面进行&#xff1a; 1. 了解Kylin的基本概念 定义&#xff1a;Apache Kylin是一个开源的分布式分析引擎&#xff0c;它基于Hadoop和HBase构建&#xff0c;提供Hadoop/Spark之上的SQL查询接口及多维分析&#xff08;OLAP&#xff09;能…...

React@16.x(46)路由v5.x(11)源码(3)- 实现 Router

目录 1&#xff0c;Router 的结构2&#xff0c;实现2.1&#xff0c;react-router1&#xff0c;matchPath.js2&#xff0c;Router.js3&#xff0c;RouterContext.jsx4&#xff0c;index.jsx 2.2&#xff0c;react-router-domBrowserRouter.jsxindex.jsx 1&#xff0c;Router 的结…...

openGauss真的比PostgreSQL差了10年?

前不久写了MogDB针对PostgreSQL的兼容性文章&#xff0c;我在文中提到针对PostgreSQL而言&#xff0c;MogDB兼容性还是不错的&#xff0c;其中也给出了其中一个能源客户之前POC的迁移报告数据。 But很快我发现总有人回留言喷我&#xff0c;而且我发现每次喷的这帮人是根本不看文…...

【国产开源可视化引擎Meta2d.js】快速上手

提示 初始化引擎后&#xff0c;会生成一个 meta2d 全局对象&#xff0c;可直接使用。 调用meta2d前&#xff0c;需要确保meta2d所在的父容器element元素位置大小已经渲染完成。如果样式或css&#xff08;特别是css动画&#xff09;没有初始化完成&#xff0c;可能会报错&…...

c#与倍福Plc通信

bcdedit /set hypervisorlaunchtype off...

【OceanBase诊断调优】—— 如何通过trace_id找到对应的执行节点IP

1. 前言 OceanBase作为分布式数据库&#xff0c;查问题找对节点很关键。好在OceanBase执行的每一条SQL都能通过trace_id来关联起来&#xff0c;知道trace_id怎么知道是在哪个节点发起的呢&#xff0c;请看本文。 2. trace_id生成规则 ob内部trace_id的生成函数如下&#xff0…...

鸿蒙开发Ability Kit(程序访问控制):【使用粘贴控件】

使用粘贴控件 粘贴控件是一种特殊的系统安全控件&#xff0c;它允许应用在用户的授权下无提示地读取剪贴板数据。 在应用集成粘贴控件后&#xff0c;用户点击该控件&#xff0c;应用读取剪贴板数据时不会弹窗提示。可以用于任何应用需要读取剪贴板的场景&#xff0c;避免弹窗…...

PL/SQL入门到实践

一、什么是PL/SQL PL/SQL是Procedural Language/Structured Query Language的缩写。PL/SQL是一种过程化编程语言&#xff0c;运行于服务器端的编程语言。PL/SQL是对SQL语言的扩展。PL/SQL结合了SQL语句和过程性编程语言的特性&#xff0c;可以用于编写存储过程、触发器、函数等…...

双非本 985 硕,我马上要入职上海AI实验室大模型算法岗

暑期实习基本结束了&#xff0c;校招即将开启。 不同以往的是&#xff0c;当前职场环境已不再是那个双向奔赴时代了。求职者在变多&#xff0c;HC 在变少&#xff0c;岗位要求还更高了。 最近&#xff0c;我们又陆续整理了很多大厂的面试题&#xff0c;帮助一些球友解惑答疑&…...

C盘清理和管理

本篇是C盘一些常用的管理方法&#xff0c;以及定期清理C盘的方法&#xff0c;大部分情况下都能避免C盘爆红。 C盘清理和管理 C盘存储管理查看存储情况清理存储存储感知清理临时文件清理不需要的 迁移存储 磁盘清理桌面存储管理应用存储管理浏览器微信 工具清理 C盘存储管理 查…...

晚上睡觉要不要关路由器?一语中的

前言 前几天小白去了一个朋友家&#xff0c;有朋友说&#xff1a;路由器不关机的话会影响睡眠吗&#xff1f; 这个影响睡眠嘛&#xff0c;确实是会的。毕竟一时冲浪一时爽&#xff0c;一直冲浪一直爽……刷剧刷抖音刷到根本停不下来&#xff0c;肯定影响睡眠。 所以晚上睡觉要…...

ardupilot开发 --- 坐标变换 篇

Good Morning, and in case I dont see you, good afternoon, good evening, and good night! 0. 一些概念1. 坐标系的旋转1.1 轴角法1.2 四元素1.3 基于欧拉角的旋转矩阵1.3.1 单轴旋转矩阵1.3.2 多轴旋转矩阵1.3.3 其他 2. 齐次变换矩阵3. visp实践 0. 一些概念 相关概念&am…...

git clone 别人项目后正确的修改和同步操作

简介 git clone主要是克隆别人的开源项目。但更高端的操作是实现本地修改的同时&#xff0c;能同步别人的在线修改&#xff0c;并且不相互干扰&#xff1a; 克隆原始项目&#xff1a;从远程仓库克隆项目到本地。添加上游仓库&#xff1a;将原始项目的远程仓库添加为上游仓库。…...

JAVA连接FastGPT实现流式请求SSE效果

FastGPT 是一个基于 LLM 大语言模型的知识库问答系统&#xff0c;提供开箱即用的数据处理、模型调用等能力。同时可以通过 Flow 可视化进行工作流编排&#xff0c;从而实现复杂的问答场景&#xff01; 一、先看效果 真正实流式请求&#xff0c;SSE效果&#xff0c;SSE解释&am…...

二分查找1

1. 二分查找&#xff08;704&#xff09; 题目描述&#xff1a; 算法原理&#xff1a; 暴力解法就是遍历数组来找到相应的元素&#xff0c;使用二分查找的解法就是每次在数组中选定一个元素来将数组划分为两部分&#xff0c;然后因为数组有序&#xff0c;所以通过大小关系舍弃…...

什么美业门店管理系统好用?2024美业收银系统软件排名分享

美业SAAS系统在美容、美发、美甲等行业中十分重要&#xff0c;这种系统为美业提供了一种数字化解决方案&#xff0c;帮助企业更高效地管理业务和客户关系。 美业门店管理系统通常提供预约管理、客户管理、库存管理、报表生成等一系列功能&#xff0c;以满足美容院、美发沙龙等…...

【文件上传】

文件上传漏洞 FileUpload 0x01 定义 服务端未对客户端上传文件进行严格的 验证和过滤造成可上传任意文件情况&#xff1b;0x02 攻击满足条件&#xff1a; 1. 上传文件能够被Web容器解释执行   2. 找到文件位置   3.上传文件未被改变内容。&#xff08;躲避安全检查&#…...

Golang 单引号、双引号和反引号的概念、用法以及区别

在 Golang&#xff08;Go 语言&#xff09;中&#xff0c;单引号 ()、双引号 (") 和反引号 () 用于不同类型的字符串和字符表示。以下是它们的概念、用法和区别&#xff1a; 1. 单引号 () 概念 单引号用于表示 字符&#xff08;rune 类型&#xff09;。一个字符表示一个…...

linux和mysql基础指令

Linux中nano和vim读可以打开记事文件。 ifdown ens33 ifup ens33 关闭&#xff0c;开启网络 rm -r lesson1 gcc -o code1 code1.c 编译c语言代码 ./code1 执行c语言代码 rm -r dir 删除文件夹 mysql> show databases-> ^C mysql> show databases; -------…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

Linux简单的操作

ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

重启Eureka集群中的节点,对已经注册的服务有什么影响

先看答案&#xff0c;如果正确地操作&#xff0c;重启Eureka集群中的节点&#xff0c;对已经注册的服务影响非常小&#xff0c;甚至可以做到无感知。 但如果操作不当&#xff0c;可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...

七、数据库的完整性

七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

算法—栈系列

一&#xff1a;删除字符串中的所有相邻重复项 class Solution { public:string removeDuplicates(string s) {stack<char> st;for(int i 0; i < s.size(); i){char target s[i];if(!st.empty() && target st.top())st.pop();elsest.push(s[i]);}string ret…...

C# WPF 左右布局实现学习笔记(1)

开发流程视频&#xff1a; https://www.youtube.com/watch?vCkHyDYeImjY&ab_channelC%23DesignPro Git源码&#xff1a; GitHub - CSharpDesignPro/Page-Navigation-using-MVVM: WPF - Page Navigation using MVVM 1. 新建工程 新建WPF应用&#xff08;.NET Framework) 2.…...

21-Oracle 23 ai-Automatic SQL Plan Management(SPM)

小伙伴们&#xff0c;有没有迁移数据库完毕后或是突然某一天在同一个实例上同样的SQL&#xff0c; 性能不一样了、业务反馈卡顿、业务超时等各种匪夷所思的现状。 于是SPM定位开始&#xff0c;OCM考试中SPM必考。 其他的AWR、ASH、SQLHC、SQLT、SQL profile等换作下一个话题…...

项目进度管理软件是什么?项目进度管理软件有哪些核心功能?

无论是建筑施工、软件开发&#xff0c;还是市场营销活动&#xff0c;项目往往涉及多个团队、大量资源和严格的时间表。如果没有一个系统化的工具来跟踪和管理这些元素&#xff0c;项目很容易陷入混乱&#xff0c;导致进度延误、成本超支&#xff0c;甚至失败。 项目进度管理软…...