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
Comments
查看第一个参数:查看第一个参数的size:将结果按name属性投影:按条件过滤:过滤后统计:判断字符串相等比如第一个参数是String类型: 判断long型 |
子表达式求值:选择第一个满足条件:选择最后一个满足条件: |
访问静态变量
|
调用静态方法调用静态方法再调用非静态方法 |
匹配线程&正则多个类多个方法 |
按条件过滤:实际用下来,需要添加 .size()>0,并且条件表达式和返回表达式是两个表达式。 |
|
内部类怎么使用 |
|
|
ognl怎么调用spring bean中的非静态方法?? |
|
一定要加 size()>0 才行,老哥thanks |
[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 。 |
|
请问,watch命令查看returnObj中的属性值怎么写? |
|
重载的方法怎么查看指定的方法呢 |
加上-x 3 |
|
请教一个问题:如下命令,测试的时候把watch换成stack就没反应了。 |
|
能watch方法内的局部变量的值吗? |
不能,用 |
|
重载方法有办法trace 么 |
|
请问watch命令:条件表达式中有特殊字符,如何转义,用ongl的转义好像不行。 |
可以直接用 |
|
入參是List的类型, |
|
怎么访问类变量的值呢?非静态变量 |
|
#1424 arthas 获取spring被代理的目标对象 |
|
请求一下watch命令支不支持“com.xx.**.controller * ”这种包路径通配的方式? |
|
想问下returnObj 怎么映射 |
|
某个同事问 如何watch 构造函数,想观察构造 函数 如何 watch 构造函数watch com.wangji92.arthas.plugin.demo.controller.User <init>如何怎么知道构造函数是啥[arthas@33447]$ sm com.wangji92.arthas.plugin.demo.controller.User
com.wangji92.arthas.plugin.demo.controller.User <init>(Ljava/lang/String;Ljava/lang/Long;)V
com.wangji92.arthas.plugin.demo.controller.User <init>()V
com.wangji92.arthas.plugin.demo.controller.User toString()Ljava/lang/String;
com.wangji92.arthas.plugin.demo.controller.User getName()Ljava/lang/String;
com.wangji92.arthas.plugin.demo.controller.User setName(Ljava/lang/String;)V
com.wangji92.arthas.plugin.demo.controller.User setAge(Ljava/lang/Long;)V
com.wangji92.arthas.plugin.demo.controller.User getAge()Ljava/lang/Long;
|
|
great examples! mark~ |
|
wathc怎么过滤掉代理类的信息,支持正则表达式吗 |
|
|
怎么调用普通类(非spring管理的)方法 |
|
某个类有个静态变量 private static String s ="abc"; |
|
如何访问内部私有类: |
|
反射修改实例的变量com.xxx.cache.CacheAspect 中的 boolean 变量 cacheEnabled 修改为false vmtoolvmtool -x 3 --action getInstances --className com.xxx.cache.CacheAspect --express '#field=instances[0].getClass().getDeclaredField("cacheEnabled"),#field.setAccessible(true),#field.set(instances[0],false)' -c 3bd94634ognl get spring static context 修改ognl -x 3 '#springContext=@com.xxx.util.SpringUtil@context,#instance=#springContext.getBean("lavaCacheAspect"),#field=@com.xxx.cache.CacheAspect@class.getDeclaredField("cacheEnabled"),#field.setAccessible(true),#field.set(#instance,false)' -c 3bd94634如果是final 的变量也可以CommonController 中定义了一个 string 的final FINAL_VALUE 修改值 vmtool -x 4 --action getInstances --className com.wangji92.arthas.plugin.demo.controller.CommonController --express '#field=instances[0].getClass().getDeclaredField("FINAL_VALUE"),#modifiers=#field.getClass().getDeclaredField("modifiers"),#modifiers.setAccessible(true),#modifiers.setInt(#field,#field.getModifiers() & ~@java.lang.reflect.Modifier@FINAL),#field.setAccessible(true),#field.set(instances[0]," 3333")' -c 18b4aac2 |
|
怎么过滤参数类型为Class的方法 |
似乎不行 |
观察watch com.wangji92.arthas.plugin.demo.controller.StaticTest invokeClass '{returnObj,throwExp}' -n 5 -x 3 'params[0].getName().equals(@com.wangji92.arthas.plug.demo.controller.User@class.getName())' -v调用ognl -x 3 '@com.wangji92.arthas.plugin.demo.controller.StaticTest@invokeClass(@com.wangji92.arthas.plugin.demo.controller.User@class)' -c 30883c26测试结果一次调用传递object 一次调用传递 user这个class 测试ok |
|
watch 能查看整个调用栈各个方法的输入输出么? |
这个现在好像还是有问题 |
复杂参数调用 使用Json 转换为具体的类信息
问题来源我想调用spring 某个service bean 的方法,方法入参包含了复杂对象,我拿到了对象的json str 所以我用JSON.parseObject(str,Class.forName("xxxClass")) 来构建参数 例子vmtool -x 3 --action getInstances --className com.wangji92.arthas.plugin.demo.controller.CommonController --express 'instances[0].userFastJson(@com.alibaba.fastjson.JSON@parseObject("{\"name\":\"name\",\"age\":18}",@com.wangji92.arthas.plugin.demo.controller.User@class))' -c 888b915这里面不允许输入中文哦,如果需要输入中文可以对Str 先进行base64处理 参考base64 处理中文 |
我的解决方案是调用公共类去筛选出来,arthas支持调用static方法的,你可以写一个方法例如 然后 伪代码写的有点粗糙,但是差不多这个意思 |
watch xxx xxx '{params,returnObj,throwExp}' 'params.length == 4 && params[1] instanceof java.lang.Throwable && params[0] == -8' -n 5 -x 3 可以在条件里面这样写,根据参数个数、参数类型和已知入参数据指定 |
watch com.XXX xxx '{params,returnObj,throwExp}' -n 5 -x 3 'params[0] instanceof xxx' 可以这样判断参数类型 |
试试这个吧 但是不太建议这样做,毕竟强转了,可以考虑写一个static方法,然后调用其来筛选 |
|
可以new对象并赋值吗 |
|
ongl 表达式怎么传Long 类型参数呢? ognl -c 3af49f1c '@util.ApplicationContextUtil@getBeanByType(@CacheService@class).getQCache((Long)1243860912981827585)' |
就1243860912981827585l 后面带个字母l就行了 |
试过了 不行呢 |
|
returnObj是一个map,map的key是class对象时, 怎么查看某个key的value呢,此时我的ognl表达式应该怎么写? |





hengyunabc commentedSep 19, 2018
收集Arthas里的一些特殊用法。
ognl表达式官网:https://commons.apache.org/proper/commons-ognl/language-guide.html
The text was updated successfully, but these errors were encountered: