Arthas 是 Alibaba 开源的 Java 诊断工具,深受开发者喜爱。
https://github.com/alibaba/arthas
Arthas 提供了非常丰富的关于调用拦截的命令,比如 trace/watch/monitor/tt 。但是很多时候我们在排查问题时,需要更多的线索,并不只是函数的参数和返回值。
比如在一个 spring 应用里,想获取到 spring context 里的其它 bean。如果能随意获取到 spring bean,那就可以“为所欲为”了,下面介绍如何利用 Arthas 获取到 spring context。
搜索类 sc -d com.alibaba.dubbo.config.spring.extension.SpringExtensionFactory
找不到对应类,可参考 http://www.zyiz.net/tech/detail-138429.html
获取数据库密码步骤
1、获取 classLoder 的 hash 值
sc -d com.alibaba.dubbo.config.spring.extension.SpringExtensionFactory
class-info com.alibaba.dubbo.config.spring.extension.SpringExtensionFactory
code-source /data/project/aladdin/second/dubbo-3.2.18-RELEASE.jar
name com.alibaba.dubbo.config.spring.extension.SpringExtensionFactory
super-class +-java.lang.Object
class-loader +-com.youzan.aladdin.container.loader.AladdinClassLoader@ae13544
+-sun.misc.Launcher$AppClassLoader@18b4aac2
+-sun.misc.Launcher$ExtClassLoader@7bb52275
classLoaderHash ae13544
2、获取对应实例数据
ognl -c ae13544 '#context=@com.alibaba.dubbo.config.spring.extension.SpringExtensionFactory@contexts.iterator.next, #context.getBean("dataSource").getPassword()'
3、可调用任务任意的方法
ognl -c ae13544 '#context=@com.alibaba.dubbo.config.spring.extension.SpringExtensionFactory@contexts.iterator.next, #obj=new com.youzan.ebiz.video.channels.item.api.param.wechat.ItemListGetReq(),#obj.kdtId=42163374,#obj.itemIds={1562453283},#context.getBean("wechatChannelConsoleServiceImpl").listAuditStatus(#obj)'