Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Arthas的一些特殊用法文档说明 #71

Closed
hengyunabc opened this issue Sep 19, 2018 · 77 comments
Closed

Arthas的一些特殊用法文档说明 #71

hengyunabc opened this issue Sep 19, 2018 · 77 comments

Comments

@hengyunabc
Copy link
Collaborator

hengyunabc commented Sep 19, 2018

收集Arthas里的一些特殊用法。

ognl表达式官网:https://commons.apache.org/dormant/commons-ognl/language-guide.html

@hengyunabc hengyunabc changed the title Arthas的一些特殊用法需要文档说明 Arthas的一些特殊用法文档说明 Sep 19, 2018
@hengyunabc
Copy link
Collaborator Author

hengyunabc commented Sep 19, 2018

查看第一个参数:

$ watch com.taobao.container.Test test "params[0]"
Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 34 ms.
@ArrayList[
    @Pojo[com.taobao.container.Test$Pojo@75a1cd57],

    @Pojo[com.taobao.container.Test$Pojo@3d012ddd],

    @Pojo[com.taobao.container.Test$Pojo@6f2b958e],

    @Pojo[com.taobao.container.Test$Pojo@1eb44e46],

    @Pojo[com.taobao.container.Test$Pojo@6504e3b2],

查看第一个参数的size:

$ watch com.taobao.container.Test test "params[0].size()"
Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 22 ms.
@Integer[40]

将结果按name属性投影:

$ watch com.taobao.container.Test test "params[0].{ #this.name }"
Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 25 ms.
@ArrayList[
    @String[name 0],

    @String[name 1],

按条件过滤:

$ watch com.taobao.container.Test test "params[0].{? #this.name == null }" -x 2
Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 27 ms.
@ArrayList[
    @Pojo[
        name=null,
        age=@Integer[32],
        hobby=null,
    ],
]
@ArrayList[
    @Pojo[
        name=null,
        age=@Integer[31],
        hobby=null,
    ],
]

$ watch com.taobao.container.Test test "params[0].{? #this.name != null }" -x 2
Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 24 ms.
@ArrayList[
    @Pojo[
        name=@String[name 1],
        age=@Integer[3],
        hobby=null,
    ],

过滤后统计:

$ watch com.taobao.container.Test test "params[0].{? #this.age > 10 }.size()" -x 2
Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 29 ms.
@Integer[31]
@Integer[31]

判断字符串相等

比如第一个参数是String类型:

$ watch com.demo.Test test 'params[0]=="xyz"'

判断long型

$ watch com.demo.Test test 'params[0]==123456789L'

@hengyunabc
Copy link
Collaborator Author

子表达式求值:

$ watch com.taobao.container.Test test "params[0].{? #this.age > 10 }.size().(#this > 20 ? #this - 10 : #this + 10)" -x 2
Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 76 ms.
@Integer[21]
@Integer[21]

选择第一个满足条件:

$ watch com.taobao.container.Test test "params[0].{^ #this.name != null}" -x 2
Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 58 ms.
@ArrayList[
    @Pojo[
        name=@String[name 0],
        age=@Integer[2],
        hobby=null,
    ],
]

$ watch com.taobao.container.Test test "params[0].{^ #this.name != null}.size()" -x 2
Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 57 ms.
@Integer[1]

选择最后一个满足条件:

$ watch com.taobao.container.Test test "params[0].{$ #this.name != null}" -x 2
Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 62 ms.
@ArrayList[
    @Pojo[
        name=@String[name 39],
        age=@Integer[41],
        hobby=null,
    ],
]

@hengyunabc
Copy link
Collaborator Author

访问静态变量

  • 在watch命令中访问如下,但是会受到classloader的限制,不推荐使用
$ watch com.taobao.container.Test test "@com.taobao.container.Test@m"
Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 36 ms.
@HashMap[
    @String[a]:@String[aaa],

    @String[b]:@String[bbb],
]
  • 使用新版本中的getstatic命令,通过-c指定classloader,可以查看任意static变量,同时支持ognl表达式处理
$ getstatic com.alibaba.arthas.Test n 'entrySet().iterator.{? #this.key.name()=="STOP"}'
field: n
@ArrayList[
    @Node[STOP=bbb],
]
Affect(row-cnt:1) cost in 68 ms.

$ getstatic com.alibaba.arthas.Test m 'entrySet().iterator.{? #this.key=="a"}'
field: m
@ArrayList[
    @Node[a=aaa],
]

@hengyunabc
Copy link
Collaborator Author

调用静态方法

$ watch com.taobao.container.Test test "@java.lang.Thread@currentThread()"

调用静态方法再调用非静态方法

$ watch com.taobao.container.Test test "@java.lang.Thread@currentThread().getContextClassLoader()"

@hengyunabc
Copy link
Collaborator Author

匹配线程&正则多个类多个方法

trace -E 'io\.netty\.channel\.nio\.NioEventLoop|io\.netty\.util\.concurrent\.SingleThreadEventExecutor'  'select|processSelectedKeys|runAllTasks' '@Thread@currentThread().getName().contains("IO-HTTP-WORKER-IOPool")&&#cost>500'

@jieyuan-shen
Copy link

按条件过滤:

$ watch com.taobao.container.Test test "{params}" "params[0].{? #this.name == null }.size()>0" -x 2
Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 27 ms.
@ArrayList[
    @Pojo[
        name=null,
        age=@Integer[32],
        hobby=null,
    ],
]
@ArrayList[
    @Pojo[
        name=null,
        age=@Integer[31],
        hobby=null,
    ],
]

实际用下来,需要添加 .size()>0,并且条件表达式和返回表达式是两个表达式。
其中条件表达式, 如果是要对字符串做比较可以写成这样:
'params[0].{? #this.deviceKey =="KPmIDmPKMV"}.size()>0'
即,外面用单引号,里面是双引号。

@jaime0815
Copy link

jaime0815 commented Jul 29, 2019

内部类怎么使用

@hengyunabc
Copy link
Collaborator Author

内部类怎么使用

OuterClass$innerClassName

@hengyunabc
Copy link
Collaborator Author

ognl怎么调用spring bean中的非静态方法??

@leiguorui #482

@leonHan01
Copy link

按条件过滤:

$ watch com.taobao.container.Test test "{params}" "params[0].{? #this.name == null }.size()>0" -x 2
Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 27 ms.
@ArrayList[
    @Pojo[
        name=null,
        age=@Integer[32],
        hobby=null,
    ],
]
@ArrayList[
    @Pojo[
        name=null,
        age=@Integer[31],
        hobby=null,
    ],
]

实际用下来,需要添加 .size()>0,并且条件表达式和返回表达式是两个表达式。
其中条件表达式, 如果是要对字符串做比较可以写成这样:
'params[0].{? #this.deviceKey =="KPmIDmPKMV"}.size()>0'
即,外面用单引号,里面是双引号。

一定要加 size()>0 才行,老哥thanks

@iamorchid
Copy link

[arthas@20]$ ognl '@com.envisioniot.enos.iot_log_sdk.core.ESClient@defaultESClient'
Failed to get static, exception message: ognl.OgnlException: Could not get static field defaultESClient from class com.envisioniot.enos.iot_log_sdk.core.ESClient [java.lang.ClassNotFoundException: Unable to resolve class: com.envisioniot.enos.iot_log_sdk.core.ESClient], please check $HOME/logs/arthas/arthas.log for more details.
[arthas@20]$
[arthas@20]$ getstatic com.envisioniot.enos.iot_log_sdk.core.ESClient defaultESClient
field: defaultESClient
@ESClient[
    logger=@Logger[com.envisioniot.enos.iot_log_sdk.core.ESClient:INFO in config_web],
    client=@PreBuiltTransportClient[org.elasticsearch.transport.client.PreBuiltTransportClient@61f30b80],
    indicesAdminClient=@IndicesAdmin[org.elasticsearch.client.support.AbstractClient$IndicesAdmin@73b9bf19],
    connected=@Boolean[true],
    bulkProcessor=@BulkProcessor[org.elasticsearch.action.bulk.BulkProcessor@4ee692a3],
    DEFAULT_TYPE=@String[default_type],
    mqttLogClient=null,
    eventManageLogClient=null,
    serviceInvokeLogClient=null,
    attrHistoryLogClient=null,
    defaultESClient=@ESClient[com.envisioniot.enos.iot_log_sdk.core.ESClient@379aef66],
]
Affect(row-cnt:1) cost in 11 ms.

为啥ognl不起作用而getstatic却在这里起作用? 我是在tomcat容器测试得。

@hengyunabc
Copy link
Collaborator Author

[arthas@20]$ ognl '@com.envisioniot.enos.iot_log_sdk.core.ESClient@defaultESClient'
Failed to get static, exception message: ognl.OgnlException: Could not get static field defaultESClient from class com.envisioniot.enos.iot_log_sdk.core.ESClient [java.lang.ClassNotFoundException: Unable to resolve class: com.envisioniot.enos.iot_log_sdk.core.ESClient], please check $HOME/logs/arthas/arthas.log for more details.
[arthas@20]$
[arthas@20]$ getstatic com.envisioniot.enos.iot_log_sdk.core.ESClient defaultESClient
field: defaultESClient
@ESClient[
    logger=@Logger[com.envisioniot.enos.iot_log_sdk.core.ESClient:INFO in config_web],
    client=@PreBuiltTransportClient[org.elasticsearch.transport.client.PreBuiltTransportClient@61f30b80],
    indicesAdminClient=@IndicesAdmin[org.elasticsearch.client.support.AbstractClient$IndicesAdmin@73b9bf19],
    connected=@Boolean[true],
    bulkProcessor=@BulkProcessor[org.elasticsearch.action.bulk.BulkProcessor@4ee692a3],
    DEFAULT_TYPE=@String[default_type],
    mqttLogClient=null,
    eventManageLogClient=null,
    serviceInvokeLogClient=null,
    attrHistoryLogClient=null,
    defaultESClient=@ESClient[com.envisioniot.enos.iot_log_sdk.core.ESClient@379aef66],
]
Affect(row-cnt:1) cost in 11 ms.

为啥ognl不起作用而getstatic却在这里起作用? 我是在tomcat容器测试得。

ognl命令默认只会去 SystemClassLoader 里找类。 getstatic 命令会直接找所有JVM里加载的类,而tomcat的classloader是自己的,所以只有 getstatic 命令能找到。 ognl 命令要显式指定classloader 。

@kingandsorrow
Copy link

kingandsorrow commented Sep 23, 2019

请问,watch命令查看returnObj中的属性值怎么写?
比如:@OrgPermVO为返回值对象,想查看对象中orgIds的值

ts=2019-09-23 22:08:27; [cost=84.447395ms] result=@ArrayList[
    @Object[][
        @OrgEntryParam[com.xxxxxxx.param.OrgEntryParam@675acde4],
    ],
    @OrgPermVO[
        serialVersionUID=@Long[-282076766124881226],
        orgIds=@HashSet[isEmpty=false;size=24],
        deptIds=@HashSet[isEmpty=false;size=1],
        withAllOrgs=@Boolean[true],
        withAllDepts=@Boolean[false],
        usingDeptDataperm=@Boolean[true],
    ],
]

@YuanSim
Copy link

YuanSim commented Sep 26, 2019

重载的方法怎么查看指定的方法呢

@jiangshubian
Copy link

jiangshubian commented Oct 6, 2019

请问,watch命令查看returnObj中的属性值怎么写?
比如:@OrgPermVO为返回值对象,想查看对象中orgIds的值

ts=2019-09-23 22:08:27; [cost=84.447395ms] result=@ArrayList[
    @Object[][
        @OrgEntryParam[com.xxxxxxx.param.OrgEntryParam@675acde4],
    ],
    @OrgPermVO[
        serialVersionUID=@Long[-282076766124881226],
        orgIds=@HashSet[isEmpty=false;size=24],
        deptIds=@HashSet[isEmpty=false;size=1],
        withAllOrgs=@Boolean[true],
        withAllDepts=@Boolean[false],
        usingDeptDataperm=@Boolean[true],
    ],
]

加上-x 3

@wayneliu91
Copy link

wayneliu91 commented Oct 29, 2019

请教一个问题:如下命令,测试的时候把watch换成stack就没反应了。
watch class method "params[0].{? #this.id == 0 }" -n 2

@johnjey
Copy link

johnjey commented Nov 5, 2019

能watch方法内的局部变量的值吗?

@hengyunabc
Copy link
Collaborator Author

能watch方法内的局部变量的值吗?

不能,用 redefine

@nimil
Copy link

nimil commented Nov 30, 2019

重载方法有办法trace 么

@XiaoyiPeng
Copy link

请问watch命令:条件表达式中有特殊字符,如何转义,用ongl的转义好像不行。
如:watch org.apache.rocketmq.broker.topic.TopicConfigManager createTopicInSendMessageBackMethod "{params,returnObj}" 'params[0]=="%RETRY%group_cccc"' -n 1 中的 '%'字符 该如何转义?

@hengyunabc
Copy link
Collaborator Author

请问watch命令:条件表达式中有特殊字符,如何转义,用ongl的转义好像不行。
如:watch org.apache.rocketmq.broker.topic.TopicConfigManager createTopicInSendMessageBackMethod "{params,returnObj}" 'params[0]=="%RETRY%group_cccc"' -n 1 中的 '%'字符 该如何转义?

可以直接用ognl命令输出字符串结果:

$ ognl '"%RETRY%group_cccc"'
@String[%RETRY%group_cccc]

@gaonico
Copy link

gaonico commented Dec 19, 2019

入參是List的类型,
watch me.server.api.ChainStoreDeliveryAreaMgmtServiceImpl queryChainStoreDeliveryArea "params[0].{#this.chainStoreIds}",
返回了
ts=2019-12-19 20:28:52; [cost=16.401208ms] result=@Arraylist[
@Arraylist[isEmpty=false;size=1],
想再过滤条件,chainStoreIds==[11253129],才需要返回,这个要怎么写呀?

@just-JL
Copy link

just-JL commented Dec 27, 2019

怎么访问类变量的值呢?非静态变量

@KATKrazy
Copy link
Contributor

watch命令打印出来的入参是结果都没有包含父类,需要加什么参数吗

@a139169370
Copy link

入參是 List 的类型, watch me.server.api.ChainStoreDeliveryAreaMgmtServiceImpl queryChainStoreDeliveryArea "params[0].{#this.chainStoreIds}", 返回了 ts=2019-12-19 20:28:52; [cost=16.401208ms] result=@Arraylist[ @Arraylist[isEmpty=false;size=1], 想再过滤条件,chainStoreIds==[11253129],才需要返回,这个要怎么写呀?

我的解决方案是调用公共类去筛选出来,arthas支持调用static方法的,你可以写一个方法例如
public static boolean getTargets(ArrayList list) {
for(Demo demo : list) {
if (demo.chainStoreIds == 11253129){
return true;
}
}
return false;
}

然后
watch me.server.api.ChainStoreDeliveryAreaMgmtServiceImpl queryChainStoreDeliveryArea "params[0].{#this.chainStoreIds}" '@全限定类目@getTargets(returnObj) == true'

伪代码写的有点粗糙,但是差不多这个意思

@a139169370
Copy link

重载的方法怎么查看指定的方法呢

watch xxx xxx '{params,returnObj,throwExp}' 'params.length == 4 && params[1] instanceof java.lang.Throwable && params[0] == -8' -n 5 -x 3

可以在条件里面这样写,根据参数个数、参数类型和已知入参数据指定

@a139169370
Copy link

怎么过滤参数类型为 Class 的方法

watch com.XXX xxx '{params,returnObj,throwExp}' -n 5 -x 3 'params[0] instanceof xxx'

可以这样判断参数类型

@a139169370
Copy link

入参是 Set [Long] 类型,watch 怎么加条件 size=1,且 params [0] 的第一个元素是 436546745 值?

试试这个吧
watch com.XXX xxx '{params,returnObj,throwExp}' 'params.size() == 1 && (Long)testCacheKeys.toArray()[0] == 436546745' -n 5 -x 3

但是不太建议这样做,毕竟强转了,可以考虑写一个static方法,然后调用其来筛选

@alibaba alibaba deleted a comment Mar 22, 2022
@AndersIves
Copy link

可以new对象并赋值吗

@Flyhww0602
Copy link

ongl 表达式怎么传Long 类型参数呢? ognl -c 3af49f1c '@util.ApplicationContextUtil@getBeanByType(@CacheService@class).getQCache((Long)1243860912981827585)'
这样好像是不行的呢

@Flyhww0602
Copy link

ognl -c 3af49f1c '@util.ApplicationContextUtil@getBeanByType(@CacheService@class).getQCache((Long)1243860912981827585)'这样是怎么传不了的呢?

1243860912981827585个背带就行了

试过了 不行呢

@lipenghao1216
Copy link

returnObj是一个map,map的key是class对象时, 怎么查看某个key的value呢,此时我的ognl表达式应该怎么写?

@497010477
Copy link
Contributor

vmtool --action getInstances --className CLAZZ --express '(#count=0, instances.{#this.wrotePostion}.{#el=#this, count=count+el},#count)' -x 2

在看来大家的用法后,我想实现对所有CLAZZ对象的wrotePostion属性求数值和,命令如上,但是报错了,如下:
Failed to execute ognl, exception message: ognl.NoSuchPropertyException: java.lang.Integer.count, please check $HOME/logs/arthas/arthas.log for more details.

我对ognl表达式不是特别熟悉,请教下正确的应该怎么写

@liucm-it
Copy link

使用命令进行重做调用,但是如果执行方法需要获取线程上下文,上下文ThreadLocal数据没有保存?
tt -i 1004 -p

@Freeman211314
Copy link

watch CouponManageFacadeImpl queryCouponByCouponId '{params,returnObj,throwExp}' 'params[0].equals("1")' -n 5 -x 3

这种可以完全匹配后打印出来结果。如果没打印出来可能是压根没执行到这个位置。

@xuqianvirtual
Copy link

lambda 应该如何 watch 或 trace ?

@2516148151
Copy link

((com.alibaba.fastjson.JSONObject)params).toString(SerializerFeature.WriteMapNullValue))
SerializerFeature.WriteMapNullValue 枚举值在ognl表达式里面应该怎么写?

@WangJi92
Copy link
Contributor

((com.alibaba.fastjson.JSONObject)params).toString(SerializerFeature.WriteMapNullValue)) SerializerFeature.WriteMapNullValue 枚举值在ognl表达式里面应该怎么写?

可以参考一下

ognl -x 3 ' @com.alibaba.fastjson.serializer.SerializerFeature@WriteMapNullValue' 

image
image

@2516148151
Copy link

2516148151 commented Dec 25, 2023

((com.alibaba.fastjson.JSONObject)params).toString(SerializerFeature.WriteMapNullValue)) SerializerFeature.WriteMapNullValue 枚举值在ognl表达式里面应该怎么写?

可以参考一下

ognl -x 3 ' @com.alibaba.fastjson.serializer.SerializerFeature@WriteMapNullValue' 
watch com.aa.bb cc '{params[0].toString(@com.alibaba.fastjson.serializer.SerializerFeature@WriteMapNullValue)}' -f -x 4

但是watch里面这么写依旧会报错

watch failed, condition is: null, express is: {params[0].toString(@com.alibaba.fastjson.serializer.SerializerFeature@WriteMapNullValue)}, java.lang.IllegalArgumentException: argument type mismatch, visit /home/amcuser/logs/arthas/arthas.log for more details.

@WangJi92
Copy link
Contributor

watch com.aa.bb cc

watch com.aa.bb cc -x 3 '@com.alibaba.fastjson.JSON@toJSONString(params[0],@com.alibaba.fastjson.serializer.SerializerFeature@WriteMapNullValue)'

@2516148151
Copy link

watch com.aa.bb cc

watch com.aa.bb cc -x 3 '@com.alibaba.fastjson.JSON@toJSONString(params[0],@com.alibaba.fastjson.serializer.SerializerFeature@WriteMapNullValue)'

还是不行呢,两种写法报的相同的错误,3.6.7,3.7.1两个版本都试了

'@com.alibaba.fastjson.JSON@toJSONString(params[0],@com.alibaba.fastjson.serializer.SerializerFeature@WriteMapNullValue)'
watch failed, condition is: null, express is: @com.alibaba.fastjson.JSON@toJSONString(params[0],@com.alibaba.fastjson.serializer.SerializerFeature@WriteMapNullValue), java.lang.IllegalArgumentException: argument type mismatch.

'params[0].toString(@com.alibaba.fastjson.serializer.SerializerFeature@WriteMapNullValue)'
watch failed, condition is: null, express is: params[0].toString(@com.alibaba.fastjson.serializer.SerializerFeature@WriteMapNullValue), java.lang.IllegalArgumentException: argument type mismatch.

@WangJi92
Copy link
Contributor

@com.alibaba.fastjson.serializer.SerializerFeature@WriteMapNullValue

没仔细看这里是可变参数要写成数组 new com.alibaba.fastjson.serializer.SerializerFeature[]{@com.alibaba.fastjson.serializer.SerializerFeature@WriteMapNullValue}

watch com.wangji92.arthas.plugin.demo.controller.CommonController userFastJson '@com.alibaba.fastjson.JSON@toJSONString(params[0],new com.alibaba.fastjson.serializer.SerializerFeature[]{@com.alibaba.fastjson.serializer.SerializerFeature@WriteMapNullValue})' -v -n 5  -x 3 '1==1'

image

@hikarika
Copy link

hikarika commented Feb 29, 2024

returnObj是一个map,map的key是class对象时, 怎么查看某个key的value呢,此时我的ognl表达式应该怎么写?

https://www.pingidentity.com/en/resources/blog/post/declaring-variables-in-ognl.html
可以new 一个对象出来,使用 ognl variables;
供各位参考~

ognl -c 302c971f '#ip = new java.net.InetSocketAddress("127.0.0.1", 18001),@ClientManager@getInstance().queryClient(#ip)'

@intprogrammer
Copy link

watch查看内部类报找不到怎么办

@hikarika
Copy link

内部类怎么使用

OuterClass$innerClassName

@intprogrammer 这里~

@zhangconan
Copy link

怎么使用ognl调用静态方法,传入一个枚举类型的值

@WangJi92
Copy link
Contributor

怎么使用ognl调用静态方法,传入一个枚举类型的值

``ognl -x 3 '@XXXClass@testEnum(@XXXX2Class.TestEnum@COMMON_1)' -c 197a18de` 和 静态字段类似 ,枚举其实就是语法糖 当前类的静态字段

@zhangconan
Copy link

怎么使用ognl调用静态方法,传入一个枚举类型的值

``ognl -x 3 '@XXXClass@testEnum(@XXXX2Class.TestEnum@COMMON_1)' -c 197a18de` 和 静态字段类似 ,枚举其实就是语法糖 当前类的静态字段

感谢。
我们的枚举类中扩展了一些属性,通过下面的方式实现了。

ognl -c 2a265ea9 '@com.XxxClass@connect(@com.XxxxEnum@valueOf("name"))'

@qq1033731787
Copy link

@hengyunabc 大佬,已知一个对象的内存地址,有办法查看这个对象吗? vmtool只能list出来 不能指定某个内存地址
比如 [java.util.concurrent.CountDownLatch@333f2f09] 我有办法查看到333f2f09这个实例吗?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests