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内置的虚拟属性
Collection | List | Map | Set | Iterator | Enumeration |
---|---|---|---|---|---|
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的杂碎,收集未做验证 Arthas常见使用姿势 官网 https://arth…...
Apache Kylin的入门学习
Apache Kylin的入门学习可以从以下几个方面进行: 1. 了解Kylin的基本概念 定义:Apache Kylin是一个开源的分布式分析引擎,它基于Hadoop和HBase构建,提供Hadoop/Spark之上的SQL查询接口及多维分析(OLAP)能…...
React@16.x(46)路由v5.x(11)源码(3)- 实现 Router
目录 1,Router 的结构2,实现2.1,react-router1,matchPath.js2,Router.js3,RouterContext.jsx4,index.jsx 2.2,react-router-domBrowserRouter.jsxindex.jsx 1,Router 的结…...

openGauss真的比PostgreSQL差了10年?
前不久写了MogDB针对PostgreSQL的兼容性文章,我在文中提到针对PostgreSQL而言,MogDB兼容性还是不错的,其中也给出了其中一个能源客户之前POC的迁移报告数据。 But很快我发现总有人回留言喷我,而且我发现每次喷的这帮人是根本不看文…...
【国产开源可视化引擎Meta2d.js】快速上手
提示 初始化引擎后,会生成一个 meta2d 全局对象,可直接使用。 调用meta2d前,需要确保meta2d所在的父容器element元素位置大小已经渲染完成。如果样式或css(特别是css动画)没有初始化完成,可能会报错&…...
c#与倍福Plc通信
bcdedit /set hypervisorlaunchtype off...
【OceanBase诊断调优】—— 如何通过trace_id找到对应的执行节点IP
1. 前言 OceanBase作为分布式数据库,查问题找对节点很关键。好在OceanBase执行的每一条SQL都能通过trace_id来关联起来,知道trace_id怎么知道是在哪个节点发起的呢,请看本文。 2. trace_id生成规则 ob内部trace_id的生成函数如下࿰…...

鸿蒙开发Ability Kit(程序访问控制):【使用粘贴控件】
使用粘贴控件 粘贴控件是一种特殊的系统安全控件,它允许应用在用户的授权下无提示地读取剪贴板数据。 在应用集成粘贴控件后,用户点击该控件,应用读取剪贴板数据时不会弹窗提示。可以用于任何应用需要读取剪贴板的场景,避免弹窗…...

PL/SQL入门到实践
一、什么是PL/SQL PL/SQL是Procedural Language/Structured Query Language的缩写。PL/SQL是一种过程化编程语言,运行于服务器端的编程语言。PL/SQL是对SQL语言的扩展。PL/SQL结合了SQL语句和过程性编程语言的特性,可以用于编写存储过程、触发器、函数等…...
双非本 985 硕,我马上要入职上海AI实验室大模型算法岗
暑期实习基本结束了,校招即将开启。 不同以往的是,当前职场环境已不再是那个双向奔赴时代了。求职者在变多,HC 在变少,岗位要求还更高了。 最近,我们又陆续整理了很多大厂的面试题,帮助一些球友解惑答疑&…...

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

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

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主要是克隆别人的开源项目。但更高端的操作是实现本地修改的同时,能同步别人的在线修改,并且不相互干扰: 克隆原始项目:从远程仓库克隆项目到本地。添加上游仓库:将原始项目的远程仓库添加为上游仓库。…...

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

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

什么美业门店管理系统好用?2024美业收银系统软件排名分享
美业SAAS系统在美容、美发、美甲等行业中十分重要,这种系统为美业提供了一种数字化解决方案,帮助企业更高效地管理业务和客户关系。 美业门店管理系统通常提供预约管理、客户管理、库存管理、报表生成等一系列功能,以满足美容院、美发沙龙等…...
【文件上传】
文件上传漏洞 FileUpload 0x01 定义 服务端未对客户端上传文件进行严格的 验证和过滤造成可上传任意文件情况;0x02 攻击满足条件: 1. 上传文件能够被Web容器解释执行 2. 找到文件位置 3.上传文件未被改变内容。(躲避安全检查&#…...
Golang 单引号、双引号和反引号的概念、用法以及区别
在 Golang(Go 语言)中,单引号 ()、双引号 (") 和反引号 () 用于不同类型的字符串和字符表示。以下是它们的概念、用法和区别: 1. 单引号 () 概念 单引号用于表示 字符(rune 类型)。一个字符表示一个…...

linux和mysql基础指令
Linux中nano和vim读可以打开记事文件。 ifdown ens33 ifup ens33 关闭,开启网络 rm -r lesson1 gcc -o code1 code1.c 编译c语言代码 ./code1 执行c语言代码 rm -r dir 删除文件夹 mysql> show databases-> ^C mysql> show databases; -------…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...

使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...

Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...

在Zenodo下载文件 用到googlecolab googledrive
方法:Figshare/Zenodo上的数据/文件下载不下来?尝试利用Google Colab :https://zhuanlan.zhihu.com/p/1898503078782674027 参考: 通过Colab&谷歌云下载Figshare数据,超级实用!!࿰…...

动态规划-1035.不相交的线-力扣(LeetCode)
一、题目解析 光看题目要求和例图,感觉这题好麻烦,直线不能相交啊,每个数字只属于一条连线啊等等,但我们结合题目所给的信息和例图的内容,这不就是最长公共子序列吗?,我们把最长公共子序列连线起…...

MeshGPT 笔记
[2311.15475] MeshGPT: Generating Triangle Meshes with Decoder-Only Transformers https://library.scholarcy.com/try 真正意义上的AI生成三维模型MESHGPT来袭!_哔哩哔哩_bilibili GitHub - lucidrains/meshgpt-pytorch: Implementation of MeshGPT, SOTA Me…...

VSCode 使用CMake 构建 Qt 5 窗口程序
首先,目录结构如下图: 运行效果: cmake -B build cmake --build build 运行: windeployqt.exe F:\testQt5\build\Debug\app.exe main.cpp #include "mainwindow.h"#include <QAppli...

CMS内容管理系统的设计与实现:多站点模式的实现
在一套内容管理系统中,其实有很多站点,比如企业门户网站,产品手册,知识帮助手册等,因此会需要多个站点,甚至PC、mobile、ipad各有一个站点。 每个站点关联的有站点所在目录及所属的域名。 一、站点表设计…...