-
Notifications
You must be signed in to change notification settings - Fork 7.5k
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
Alibaba Arthas实践--获取到Spring Context,然后为所欲为 #482
Comments
spring bean中要调用的方法参数是对象类型,这个要怎么调用呢? |
参考 https://commons.apache.org/proper/commons-ognl/language-guide.html "Calling Constructors" |
spring bean中调用无异常抛出的方法成功,但调用有异常(加了注解事物)的方法时报java.lang.NoSuchMethodException错?有异常方法调用和普通的不一致吗? |
应该是一个aop动态生成的类,有些行为可能不一样。可以自己在代码里试下。 |
请教个问题 获取到spring context之后,如调用bean方法getXXX("参数")方法,中文参数无法正确显示和传递到方法上执行,如何解决??? |
这个ognl语言不简单~~~ |
arthas 基本命令和 ognl 使用起来还是有点麻烦,毕竟不经常使用ognl语言,这里弄了一个小插件可以简化一些常用的命令的使用,具体可以参考 https://plugins.jetbrains.com/plugin/13581-arthas-idea |
tt -i 1000 -w 'target.getApplicationContext().getBean("userService")' |
贴出全部的操作日志和结果 |
`[arthas@9]$ tt -t org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter invokeHandlerMethod
|
获取到的repository都是null,项目是springboot,持久层是jpa |
。。这个是cglib的代理对象,搜索下cglib原理相关。 |
之前给同事排查遇到过,可以使用这个看一下! tt -i 1000 -w '#userServers=target.getApplicationContext().getBean("userService"),@org.springframework.aop.support.AopUtils@getTargetClass(#userServers)' |
大佬 我是想获取到userService对象后调用对象的方法 你发的命令执行完后显示如下 [arthas@9]$ tt -i 1003 -w '#userService=target.getApplicationContext().getBean("userService"), @org.springframework.aop.support.AopUtils@getTargetClass(#userService)' ], |
谢谢大佬,我查下资料 |
看看这个文章-arthas 入门最佳实践直接使用arthas idea plugin 生成 通过静态的static 、或者tt 也就是你这种方式、或者watch 直接集成给你生成命令 |
|
great examples! mark~ |
mark |
1 similar comment
mark |
大佬你好,我在使用中遇到一个问题,就是target.getApplicationContext()报了一个NoSuchMethodException的错误。所以在getBean()的时候更加拿不到了。我们使用的是springboot项目。 tt -t com.hm.mayson.module.recommend.service.link.CdssRuleLink profileRecommend -n 5 INDEX TIMESTAMP COST(m IS-RE IS-EX OBJECT CLASS METHOD
|
@yqt8926 现在可以用 vmtool 命令更方便 : https://arthas.aliyun.com/doc/vmtool ,把在线教程跑一下。 |
感谢感谢,已经获取到了。 |
tt -i 1002 -w 'target.getApplicationContext().getBean("tempController")' |
@Miliving 上面的回复就有关于这个null的,这是cglib生成的代理类。 |
|
|
在上面的示例里:tt -t org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter invokeHandlerMethod。最好把-n 1加上,即tt -n 1 -t org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter invokeHandlerMethod。不然在线上会把所有流量拦截 |
执行后出现这个错误啥情况 |
[arthas@11232]$ tt -i 1002 -w 'target.getApplicationContext().getBean("fooService").save((#foo=new com.example.lewjun.model.Foo(), #foo.setName("LewJun"), #foo))'
@Boolean[true]
Affect(row-cnt:1) cost in 1 ms.
[arthas@11232]$ tt -i 1002 -w 'target.getApplicationContext().getBean("fooService").getById(6)'
@Foo[
id=@Integer[6],
name=@String[LewJun],
height=null,
sex=null,
]
Affect(row-cnt:1) cost in 1 ms.
[arthas@11232]$ |
背景
Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱。
Arthas提供了非常丰富的关于调用拦截的命令,比如 trace/watch/monitor/tt 。但是很多时候我们在排查问题时,需要更多的线索,并不只是函数的参数和返回值。
比如在一个spring应用里,想获取到spring context里的其它bean。如果能随意获取到spring bean,那就可以“为所欲为”了。
下面介绍如何利用Arthas获取到spring context。
Demo: https://github.com/hengyunabc/spring-boot-inside/tree/master/demo-arthas-spring-boot
Arthas快速开始:https://alibaba.github.io/arthas/quick-start.html
使用tt命令获取到spring context
Demo是一个spring mvc应用,请求会经过一系列的spring bean处理,那么我们可以在spring mvc的类里拦截到一些请求。
启动Demo:
mvn spring-boot:run
使用Arthas Attach成功之后,执行
tt
命令来记录RequestMappingHandlerAdapter#invokeHandlerMethod
的请求然后访问一个网页: http://localhost:8080/
可以看到Arthas会拦截到这个调用,index是1000,并且打印出:
那么怎样获取到spring context?
可以用
tt
命令的-i
参数来指定index,并且用-w
参数来执行ognl表达式来获取spring context:从spring context里获取任意bean
获取到spring context之后,就可以获取到任意的bean了,比如获取到
helloWorldService
,并调用getHelloMessage()
函数:更多的思路
在很多代码里都有static函数或者static holder类,顺滕摸瓜,可以获取很多其它的对象。比如在Dubbo里通过
SpringExtensionFactory
获取spring context:链接
The text was updated successfully, but these errors were encountered: