背景
arthas执行ognl表达式,获取对应的jvm对象数据。ognl学习,可以查看上篇:https://xiaopanjia.blog.csdn.net/article/details/130425414
基本语法
ognl express -c {hashCode} --classLoaderClass {当前的全路径 ClassLoader 信息} -x {number}
参数说明
参数名称 | 参数说明 |
---|---|
express | 执行的表达式 |
[c:] | 执行表达式的 ClassLoader 的 hashcode,默认值是 SystemClassLoader |
[classLoaderClass:] | 指定执行表达式的 ClassLoader 的 class name |
[x] | 结果对象的展开层次,默认值 1 |
例如:
1、调用静态方法, 简单入参 返回普通对象
ognl '@com.shirc.arthasexample.ognl.OgnlTest@getPerson("src",18)' -X 1
2、方法A的返回值当做方法B的入参, 执行多行表达式,赋值给临时变量,返回一个List
ognl '#value1=@com.shirc.arthasexample.ognl.OgnlTest@getPerson("src",18),
#value2=@com.shirc.arthasexample.ognl.OgnlTest@setPerson(#value1),{#value1,#value2}' -x 2
3、方法入参是简单类型列表
ognl '@com.shirc.arthasexample.ognl.OgnlTest@getChilds({"test1","test2"})' -x 2
4、方法入参是一个复杂对象
ognl '#obj=new com.shirc.arthasexample.ognl.Shirc("test1",'test2'),
@com.shirc.arthasexample.ognl.OgnlTest@inputObj(#obj)' -x 2
5、方法入参是一个Map对象
ognl '#inputmap=#{ "foo" : "foo value", "bar" : "bar value" },
@com.shirc.arthasexample.ognl.OgnlTest@getMap(#inputmap)' -x 2
6、
#变量引用
引用变量的方法是在变量名之前加上#this
当前对象
OGNL在计算表达式的过程中, 随时会将当前对象保存在 "this"
变量中, 这个变量也可以象其他任何变量一样引用,用 #this
表示当前对象
例如:
shirc: 是map的key; 记得要用双引号"" 引起来
ognl '@com.shirc.arthasexample.ognl.OgnlTest@getMap()["shirc"].
(#this.sex=="boy"?"BoyNB":"GirlNB")' -x 2
7、 通过 hashcode 指定 ClassLoader:
$ classloader -t
+-BootstrapClassLoader
+-jdk.internal.loader.ClassLoaders$PlatformClassLoader@301ec38b
+-com.taobao.arthas.agent.ArthasClassloader@472067c7
+-jdk.internal.loader.ClassLoaders$AppClassLoader@4b85612c
+-org.springframework.boot.loader.LaunchedURLClassLoader@7f9a81e8
$ ognl -c 7f9a81e8 @org.springframework.boot.SpringApplication@logger
@Slf4jLocationAwareLog[
FQCN=@String[org.apache.commons.logging.LogAdapter$Slf4jLocationAwareLog],
name=@String[org.springframework.boot.SpringApplication],
logger=@Logger[Logger[org.springframework.boot.SpringApplication]],
]
对于只有唯一实例的 ClassLoader 可以通过 class name 指定,使用起来更加方便:
$ ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader @org.springframework.boot.SpringApplication@logger
@Slf4jLocationAwareLog[
FQCN=@String[org.apache.commons.logging.LogAdapter$Slf4jLocationAwareLog],
name=@String[org.springframework.boot.SpringApplication],
logger=@Logger[Logger[org.springframework.boot.SpringApplication]],
]
参考
【Arthas】命令之ognl使用姿势 - 腾讯云开发者社区-腾讯云