Giter Site home page Giter Site logo

wangji92 / arthas-idea-plugin Goto Github PK

View Code? Open in Web Editor NEW
568.0 16.0 96.0 16.9 MB

arthas idea plugin 更简单的使用arthas的IDEA 插件,方便的构建各种arthas 命令,复制到剪切板 然后到服务器上启动arthas 执行命令。

Home Page: https://plugins.jetbrains.com/plugin/13581-arthas-idea

License: Apache License 2.0

Java 95.69% Shell 4.31%
idea idea-plugin arthas arthas-idea-plugin java-tools

arthas-idea-plugin's Introduction

arthas idea plugin

联系方式

有问题直接加我微信wj983433479 或者 扫码添加钉钉群 32102545 沟通

帮助文档链接

more issue : https://github.com/WangJi92/arthas-idea-plugin/issues label=documentation

如果你喜欢这款插件,欢迎给身边的小伙伴推荐,给个github star,谢谢

一、背景

目前Arthas 官方的工具还不够足够的简单,需要记住一些命令,特别是一些扩展性特别强的高级语法,比如ognl获取spring context 为所欲为,watch、trace 不够简单,需要构造一些命令工具的信息,因此只需要一个能够简单处理字符串信息的插件即可使用。当在处理线上问题的时候需要最快速、最便捷的命令,因此Idea arthas 插件还是有存在的意义和价值的。

二、支持的功能

支持的功能都是平时处理最常用的一些功能,一些快捷的链接,在处理紧急问题时候不需要到处查找,都是一些基本的功能,自动复制到剪切板中去,方便快捷。

image

2.1 watch

watch StringUtils uncapitalize '{params,returnObj,throwExp}' -n 5 -x 3

2.2 trace 

trace StringUtils uncapitalize -n 5

2.3 static ognl (字段或者方法)

2.3.1 右键static ognl

2.3.2 获取classload命令

必须要获取,不然会找不到classload,arthas 官方获取问题系统的classload,spring 项目应该无法获取到这个class的信息,因此首先执行一下这个命令

sc -d StringUtils

2.3.2 复制到界面,获取命令,执行即可

ognl  -x  3  '@StringUtils@uncapitalize(" ")' -c 8bed358

2.4 Invoke Bean Method

 实际上就是根据当前的spring项目中的获取静态的spring context这样可以直接根据这个context直接获取任何的Bean方法,一般在Java后端服务中都有这样的Utils类,因此这个可以看为一个常量! 可以参考:arthas idea demo 有了这个,我们可以跟进一步的进行数据简化,由于在idea这个环节中,可以获取方法参数,spring bean的名称等等,非常的方便。

package com.wangji92.arthas.plugin.demo.common;

import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

/**
 * 提供给arthas ognl 获取context的信息
 *
 * @author 汪小哥
 * @date 30-28-2020
 */
@Component
public class ApplicationContextProvider implements ApplicationContextAware {
    private static ApplicationContext context;

    public ApplicationContext getApplicationContext() {
        return context;
    }

    @Override
    public void setApplicationContext(ApplicationContext ctx) {
        context = ctx;
    }
}

2.4.1 设置获取spring context的上下文

arthas idea plugin 配置

2.4.2 右键点击需要调用的方法

这里的策略和static ognl 一样的,本质还是ognl的调用。

ognl  -x  3  '#springContext=@applicationContextProvider@context,#springContext.getBean("arthasInstallCommandAction").actionPerformed(new com.intellij.openapi.actionSystem.AnActionEvent())' -c desw22

特别说明对于ognl 字段类型的处理

代码地址

2.6 常用特殊用法链接

Development Guide

CONTRIBUTING

arthas-idea-plugin's People

Contributors

15257703071 avatar anjia0532 avatar f-sunrise-q avatar iceqing avatar reminance avatar wangji92 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

arthas-idea-plugin's Issues

idea 中如何 通过arthas idea plugin 查看 scala 文件 构建 arthas 命令

最近 有位开发 karfla 的大神问 scala 中如何构建arthas 命令呢?能够支持?
idea 中查看 scala 编译后的文件默认为scala的源码
Java bytecode decompiler in IntelliJIDEA for Scala 可以看看这篇文章、也遇到同样的问题。
image

idea 2020.2 高版本支持 查看编译后的文件转为 .class 文件进行查看,右键 Decompile Scala to Java。 arthas idea plugin 默认支持.class 和java 文件构建命令的! 因此 这种情况下也可以使用 arthas idea 构建 arthas 的命令。

image

转换为.class 文件之后 就可以直接使用arthas 插件构建命令了。

redefine失败,找不到class文件

环境:Windows 10 x64、gitbash(mintty 3.4.2)、idea 2020.02、arthas-idea-plugin 2.26
问题描述:在gitbash中执行脚本后,redefine语句提示class文件不存在。
可能原因:路径分隔符不同导致找不到指定文件。手动执行(redefine C:\xxx\xxx.class)成功,执行(redefine /c/xxx/xxx.class)失败找不到文件。
image
image

hot redefine error

错误日志

执行步骤
1、新的项目 不进行编译,目录target 目录下面没有文件
2、不打开热更新前先编译
3、执行操作热更新就会报错 ,为什么是偶现的,由于后续会编译 target 下面有文件了。

java.lang.IllegalArgumentException: Argument for @NotNull parameter 'element' of com/intellij/openapi/module/ModuleUtilCore.findModuleForPsiElement must not be null
  at com.intellij.openapi.module.ModuleUtilCore.$$$reportNull$$$0(ModuleUtilCore.java)
  at com.intellij.openapi.module.ModuleUtilCore.findModuleForPsiElement(ModuleUtilCore.java)
  at com.github.wangji92.arthas.plugin.utils.OgnlPsUtils.getCompilerOutputPath(OgnlPsUtils.java:316)
  at com.github.wangji92.arthas.plugin.action.arthas.ArthasHotRedefineCommandAction.lambda$actionPerformed$7(ArthasHotRedefineCommandAction.java:116)
  at com.intellij.openapi.application.WriteAction.lambda$runAndWait$1(WriteAction.java:123)
  at com.intellij.openapi.application.impl.ApplicationImpl.runWriteActionWithClass(ApplicationImpl.java:1020)
  at com.intellij.openapi.application.impl.ApplicationImpl.runWriteAction(ApplicationImpl.java:1070)
  at com.intellij.openapi.application.WriteAction.computeAndWait(WriteAction.java:138)
  at com.intellij.openapi.application.WriteAction.runAndWait(WriteAction.java:122)
  at com.github.wangji92.arthas.plugin.action.arthas.ArthasHotRedefineCommandAction$1.lambda$null$0(ArthasHotRedefineCommandAction.java:270)
  at com.intellij.task.impl.ProjectTaskManagerImpl$ListenerNotificator.lambda$finished$0(ProjectTaskManagerImpl.java:243)
  at com.intellij.ui.GuiUtils.invokeLaterIfNeeded(GuiUtils.java:377)
  at com.intellij.task.impl.ProjectTaskManagerImpl$ListenerNotificator.finished(ProjectTaskManagerImpl.java:238)
  at com.intellij.task.impl.ProjectTaskManagerImpl$ProjectTaskResultsAggregator.add(ProjectTaskManagerImpl.java:308)
  at com.intellij.task.impl.ProjectTaskManagerImpl$ProjectTaskRunnerNotification.finished(ProjectTaskManagerImpl.java:278)
  at com.intellij.task.impl.JpsProjectTaskRunner.a(JpsProjectTaskRunner.java:72)
  at com.intellij.compiler.CompilerManagerImpl$ListenerNotificator.finished(CompilerManagerImpl.java:535)
  at com.intellij.compiler.impl.CompileDriver.a(CompileDriver.java:494)
  at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
  at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:764)
  at java.awt.EventQueue.access$500(EventQueue.java:98)
  at java.awt.EventQueue$3.run(EventQueue.java:715)
  at java.awt.EventQueue$3.run(EventQueue.java:709)
  at java.security.AccessController.doPrivileged(Native Method)
  at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
  at java.awt.EventQueue.dispatchEvent(EventQueue.java:734)
  at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.java:741)
  at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:690)
  at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:385)
  at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205)
  at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
  at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
  at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
  at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
  at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

支持设置 static final变量的值-2.7版本支持

问题来源

问题设置static final

解决思路

通过ognl 反射处理,参考java 反射 设置static final

参数的值

   private static final String  final_text ="1222222";

ognl 的值得信息 ,这里没有进行final 重新加入,弹框编写不方便

ognl -x 3  '#[email protected]@class.getDeclaredField("final_text"),#modifiers=#field.getClass().getDeclaredField("modifiers"),#modifiers.setAccessible(true),#modifiers.setInt(#field,#field.getModifiers() & [email protected]@FINAL),#field.setAccessible(true),#field.set(null," 4444")' -c 18b4aac2

复杂的ognl 版本,没有使用这个放置在插件里面

ognl -x 3  '#[email protected]@class.getDeclaredField("final_text"),#modifiers=#field.getClass().getDeclaredField("modifiers"),#modifiers.setAccessible(true),#modifiers.setInt(#field,#field.getModifiers() & [email protected]@FINAL),#field.setAccessible(true),#field.set(null,"66666"),#modifiers.setInt(#field,#field.getModifiers()& [email protected]@FINAL)' -c 18b4aac2

arthas idea 支持版本 2.7+

如何远程连接?

插件只能arthas本机吗?意义不大吧,主要应该是远程主机可以配置化比较适合

Quickly Shell Command -jad

  • jad should support classloader hashcode
********************************************************************************************************************************************
* arthas idea plugin hot swap begin;start script path: /Users/wangji/Documents/project/study/arthas-idea-plugin-common-execution-script.sh *
********************************************************************************************************************************************

********************************
* last: execute arthas command *
********************************

arthas start command :/Users/wangji/opt/arthas/as.sh --height 100 --width 200 --select com.wangji92.arthas.plugin.demo.ArthasPluginDemoApplication  -c "jad --source-only com.wangji92.arthas.plugin.demo.controller.StaticTest "  | tee /Users/wangji/opt/arthas/arthasCommonScriptCommand.out
Arthas script version: 3.5.0
[INFO] JAVA_HOME: /Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk/Contents/Home
[INFO] Process 4575 already using port 3658
[INFO] Process 4575 already using port 8563
Arthas home: /Users/wangji/opt/arthas
Calculating attach execution time...
Attaching to 4575 using version /Users/wangji/opt/arthas...

real	0m0.281s
user	0m0.465s
sys	0m0.060s
Attach success.
  ,---.  ,------. ,--------.,--.  ,--.  ,---.   ,---.
 /  O  \ |  .--. ''--.  .--'|  '--'  | /  O  \ '   .-'
|  .-.  ||  '--'.'   |  |   |  .--.  ||  .-.  |`.  `-.
|  | |  ||  |\  \    |  |   |  |  |  ||  | |  |.-'    |
`--' `--'`--' '--'   `--'   `--'  `--'`--' `--'`-----'


wiki       https://arthas.aliyun.com/doc
tutorials  https://arthas.aliyun.com/doc/arthas-tutorials.html
version    3.5.0
main_class com.wangji92.arthas.plugin.demo.ArthasPluginDemoApplication
pid        4575
time       2021-05-08 11:28:43

[arthas@4575]$ jad --source-only com.wangji92.arthas.plugin.demo.controller.StaticTest | plaintext
 Found more than one class for: com.wangji92.arthas.plugin.demo.controller.StaticTest, Please use jad -c <hashcode> com.wangji92.arthas.plugin.demo.controller.StaticTest
 NAME                                                   HASHCODE  CLASSLOADER
 com.wangji92.arthas.plugin.demo.controller.StaticTest  18b4aac2  +-sun.misc.La
                                                                    uncher$AppC
                                                                    lassLoader@
                                                                    18b4aac2
                                                                    +-sun.misc.
                                                                      Launcher$
                                                                      ExtClassL
                                                                      oader@160
                                                                      22d9d
 com.wangji92.arthas.plugin.demo.controller.StaticTest  58030581  +-org.springf
                                                                    ramework.bo
                                                                    ot.devtools
                                                                    .restart.cl
                                                                    assloader.R
                                                                    estartClass
                                                                    Loader@5803
                                                                    0581
                                                                    +-sun.misc.
                                                                      Launcher$
                                                                      AppClassL
                                                                      oader@18b
                                                                      4aac2
                                                                      +-sun.mis
                                                                        c.Launc
                                                                        her$Ext
                                                                        ClassLo
                                                                        ader@16
                                                                        022d9d

 Found more than one class for: com.wangji92.arthas.plugin.demo.controller.StaticTest, Please use jad -c <hashcode> com.wangji92.arthas.plugin.demo.controller.StaticTest
[arthas@4575]$ quit

****************************************************************************************
* you can get execute result in /Users/wangji/opt/arthas/arthasCommonScriptCommand.out *
****************************************************************************************

idea 报错

arthas idea: 2.39
idea: 2022.3.2

ArthasOgnlSpringContextInvokeMethodAction#update@GoToAction (com.github.wangji92.arthas.plugin.action.arthas.ArthasOgnlSpringContextInvokeMethodAction), actionId=ArthasInvokeBeanMethod, text='Static Spring Context Invoke Method Field'

java.lang.NullPointerException: Cannot invoke "String.contains(java.lang.CharSequence)" because the return value of "com.github.wangji92.arthas.plugin.utils.OgnlPsUtils.getCommonOrInnerOrAnonymousClassName(com.intellij.psi.PsiElement)" is null
at com.github.wangji92.arthas.plugin.utils.OgnlPsUtils.isAnonymousClass(OgnlPsUtils.java:41)
at com.github.wangji92.arthas.plugin.action.arthas.ArthasOgnlSpringContextInvokeMethodAction.update(ArthasOgnlSpringContextInvokeMethodAction.java:62)
at com.intellij.openapi.actionSystem.ex.ActionUtil.lambda$performDumbAwareUpdate$0(ActionUtil.java:157)
at com.intellij.openapi.actionSystem.ex.ActionUtil.performDumbAwareUpdate(ActionUtil.java:180)
at com.intellij.openapi.actionSystem.impl.ActionUpdater.doUpdate(ActionUpdater.java:720)
at com.intellij.openapi.actionSystem.impl.ActionUpdater.lambda$updateActionReal$4(ActionUpdater.java:136)
at com.intellij.openapi.actionSystem.impl.ActionUpdater.lambda$computeOnEdt$7(ActionUpdater.java:233)
at com.intellij.openapi.progress.ProgressManager.lambda$runProcess$0(ProgressManager.java:68)
at com.intellij.openapi.progress.impl.CoreProgressManager.lambda$runProcess$2(CoreProgressManager.java:186)
at com.intellij.openapi.progress.impl.CoreProgressManager.lambda$executeProcessUnderProgress$13(CoreProgressManager.java:604)
at com.intellij.openapi.progress.impl.CoreProgressManager.registerIndicatorAndRun(CoreProgressManager.java:679)
at com.intellij.openapi.progress.impl.CoreProgressManager.computeUnderProgress(CoreProgressManager.java:635)
at com.intellij.openapi.progress.impl.CoreProgressManager.executeProcessUnderProgress(CoreProgressManager.java:603)
at com.intellij.openapi.progress.impl.ProgressManagerImpl.executeProcessUnderProgress(ProgressManagerImpl.java:60)
at com.intellij.openapi.progress.impl.CoreProgressManager.runProcess(CoreProgressManager.java:173)
at com.intellij.openapi.progress.ProgressManager.runProcess(ProgressManager.java:68)
at com.intellij.openapi.actionSystem.impl.ActionUpdater.lambda$computeOnEdt$8(ActionUpdater.java:229)
at com.intellij.diagnostic.telemetry.TraceKt.computeWithSpan(trace.kt:123)
at com.intellij.openapi.actionSystem.impl.ActionUpdater.lambda$computeOnEdt$9(ActionUpdater.java:225)
at io.opentelemetry.context.Context.lambda$wrapSupplier$8(Context.java:309)
at com.intellij.openapi.actionSystem.impl.ActionUpdateEdtExecutor.lambda$computeOnEdt$0(ActionUpdateEdtExecutor.java:51)
at com.intellij.openapi.application.TransactionGuardImpl$1.run(TransactionGuardImpl.java:194)
at com.intellij.openapi.application.impl.ApplicationImpl.runIntendedWriteActionOnCurrentThread(ApplicationImpl.java:838)
at com.intellij.openapi.application.impl.ApplicationImpl$3.run(ApplicationImpl.java:454)
at com.intellij.openapi.application.impl.FlushQueue.doRun(FlushQueue.java:74)
at com.intellij.openapi.application.impl.FlushQueue.runNextEvent(FlushQueue.java:114)
at com.intellij.openapi.application.impl.FlushQueue.flushNow(FlushQueue.java:36)
at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:318)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:779)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:730)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:724)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:749)
at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.java:909)
at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:756)
at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$5(IdeEventQueue.java:437)
at com.intellij.openapi.progress.impl.CoreProgressManager.computePrioritized(CoreProgressManager.java:787)
at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$6(IdeEventQueue.java:436)
at com.intellij.openapi.application.TransactionGuardImpl.performActivity(TransactionGuardImpl.java:105)
at com.intellij.ide.IdeEventQueue.performActivity(IdeEventQueue.java:615)
at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$7(IdeEventQueue.java:434)
at com.intellij.openapi.application.impl.ApplicationImpl.runIntendedWriteActionOnCurrentThread(ApplicationImpl.java:838)
at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:480)
at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:207)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:92)

TimeTunnel Tt 时间隧道

tt 说明

tt 主要是用来记录请求的数据,方便二次触发,比如和测试找bug,触发了一次之后自己触发调试即可,不过这种场景用得还是比较少,现在获取tt 主要是为了获取spring context 然后进行一些操作。参考 arthas 这个获取spring context

打开 tt 命令

idea 打开右键获取tt命令
image

界面 说明

  • 一个是当前方法执行tt的命令
  • 一个是执行tt中使用常见的命令
    image
    停留一会回出现一些中文的提示信息
    image
com.github.wangji92.arthas.plugin.common.enums.TimeTunnelCommandEnum 主要是这个类

image

命令演示

接口信息

image

arthas 打开 执行命令(参考arthas 安装)

image

触发一下这个接口

image

tt time list 按Q 退出

image

执行一次重新触发一次

重常用命令列表选择复制命令粘贴到arthas的界面
image

tt -p -i 1000

周期性的触发

重新出发5次,每次时间间隔 2秒

tt -p --replay-times 5 --replay-interval 2000 -i 1000

image
image

特殊用法 获取spring contxt

image
前提是要触发一次 spring mvc的相关的接口
arthas 官方问题链接

tt -t org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter invokeHandlerMethod

其他的使用和上面的一致的,这里有了这个index 就可以获取spring context 了
image

这里的index 要修改为1001

tt -w 'target.getApplicationContext()' -i 1001

image
效果如下
image
也可以获取某个bean 处理方法

tt -w 'target.getApplicationContext().getBean("controllerTest").test()' -i 1001

image
image

other 示范

tt -w 'target.getApplicationContext().getBean(@org.springframework.web.servlet.view.BeanNameViewResolver@class).getOrder()' -i 1001

image

还有其他的获取spring context的方法?

1、上面的tt 获取

这种需要触发一次不是很方便

2、静态的stata 的 spring context

image
image
image

ognl -x 3 '#springContext=@com.wj.study.demo.generator.ApplicationContextProvider@context,#springContext.getBean("controllerTest").test()' -c 18b4aac2

arthas 插件命令直接支持
配置一下静态的位置即可。
image

3、watch 获取

这种需要触发一次不是很方便

watch org.springframework.web.servlet.DispatcherServlet doDispatch '@org.springframework.web.context.support.WebApplicationContextUtils@getWebApplicationContext(params[0].getServletContext()).getBean("controllerTest").test()' -n 5 -x 3

image

[arthas] get is enum error

java.lang.Throwable: Control-flow exceptions (like ProcessCanceledException) should never be logged: ignore for explicitly started processes or rethrow to handle on the outer process level
at com.intellij.openapi.diagnostic.Logger.ensureNotControlFlow(Logger.java:234)
at com.intellij.idea.IdeaLogger.doLogError(IdeaLogger.java:198)
at com.intellij.idea.IdeaLogger.error(IdeaLogger.java:189)
at com.intellij.openapi.diagnostic.Logger.error(Logger.java:204)
at com.github.wangji92.arthas.plugin.utils.OgnlPsUtils.psiElementInEnum(OgnlPsUtils.java:564)
at com.github.wangji92.arthas.plugin.action.arthas.ArthasHotRedefineCommandAction.lambda$update$0(ArthasHotRedefineCommandAction.java:70)
at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:176)
at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195)
at java.base/java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:948)
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:913)
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:578)
at com.github.wangji92.arthas.plugin.action.arthas.ArthasHotRedefineCommandAction.update(ArthasHotRedefineCommandAction.java:70)
at com.intellij.openapi.actionSystem.ex.ActionUtil.lambda$performDumbAwareUpdate$0(ActionUtil.java:130)
at com.intellij.openapi.actionSystem.ex.ActionUtil.performDumbAwareUpdate(ActionUtil.java:144)
at com.intellij.openapi.actionSystem.impl.ActionUpdater.doUpdate(ActionUpdater.java:584)
at com.intellij.openapi.actionSystem.impl.ActionUpdater.lambda$updateActionReal$7(ActionUpdater.java:132)
at com.intellij.openapi.actionSystem.impl.ActionUpdater.lambda$callAction$9(ActionUpdater.java:187)
at com.intellij.openapi.progress.ProgressManager.lambda$runProcess$0(ProgressManager.java:57)
at com.intellij.openapi.progress.impl.CoreProgressManager.lambda$runProcess$2(CoreProgressManager.java:183)
at com.intellij.openapi.progress.impl.CoreProgressManager.registerIndicatorAndRun(CoreProgressManager.java:705)
at com.intellij.openapi.progress.impl.CoreProgressManager.executeProcessUnderProgress(CoreProgressManager.java:647)
at com.intellij.openapi.progress.impl.ProgressManagerImpl.executeProcessUnderProgress(ProgressManagerImpl.java:63)
at com.intellij.openapi.progress.impl.CoreProgressManager.runProcess(CoreProgressManager.java:170)
at com.intellij.openapi.progress.ProgressManager.runProcess(ProgressManager.java:57)
at com.intellij.openapi.actionSystem.impl.ActionUpdater.lambda$callAction$10(ActionUpdater.java:185)
at com.intellij.openapi.actionSystem.impl.ActionUpdateEdtExecutor.lambda$computeOnEdt$0(ActionUpdateEdtExecutor.java:45)
at com.intellij.openapi.actionSystem.impl.Utils.lambda$expandActionGroupFastTrack$3(Utils.java:221)
at com.intellij.openapi.actionSystem.impl.Utils.runLoopAndWaitForFuture(Utils.java:524)
at com.intellij.openapi.actionSystem.impl.Utils.expandActionGroupFastTrack(Utils.java:219)
at com.intellij.openapi.actionSystem.impl.Utils.expandActionGroupImpl(Utils.java:149)
at com.intellij.openapi.actionSystem.impl.Utils.fillMenu(Utils.java:243)
at com.intellij.openapi.actionSystem.impl.ActionMenu.fillMenuInner(ActionMenu.java:345)
at com.intellij.openapi.actionSystem.impl.Utils.performWithRetries(Utils.java:564)
at com.intellij.openapi.actionSystem.impl.ActionMenu.fillMenu(ActionMenu.java:324)
at com.intellij.openapi.actionSystem.impl.ActionMenu.setPopupMenuVisible(ActionMenu.java:295)
at java.desktop/javax.swing.JPopupMenu.menuSelectionChanged(JPopupMenu.java:1484)
at java.desktop/javax.swing.MenuSelectionManager.setSelectedPath(MenuSelectionManager.java:129)
at java.desktop/javax.swing.plaf.basic.BasicMenuUI.appendPath(BasicMenuUI.java:258)
at java.desktop/javax.swing.plaf.basic.BasicMenuUI$Actions.actionPerformed(BasicMenuUI.java:316)
at java.desktop/javax.swing.Timer.fireActionPerformed(Timer.java:317)
at java.desktop/javax.swing.Timer$DoPostEvent.run(Timer.java:249)
at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:313)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:776)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:727)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:746)
at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.java:885)
at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:754)
at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$6(IdeEventQueue.java:441)
at com.intellij.openapi.progress.impl.CoreProgressManager.computePrioritized(CoreProgressManager.java:825)
at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$7(IdeEventQueue.java:440)
at com.intellij.openapi.application.impl.ApplicationImpl.runIntendedWriteActionOnCurrentThread(ApplicationImpl.java:794)
at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:492)
at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
Caused by: com.intellij.openapi.progress.ProcessCanceledException
at com.intellij.util.SlowOperations.assertSlowOperationsAreAllowed(SlowOperations.java:79)
at com.intellij.util.indexing.FileBasedIndexImpl.ensureUpToDate(FileBasedIndexImpl.java:754)
at com.intellij.psi.stubs.StubIndexImpl.getContainingIds(StubIndexImpl.java:501)
at com.intellij.psi.stubs.StubIndexImpl.processElements(StubIndexImpl.java:305)
at com.intellij.psi.stubs.StubIndex.getElements(StubIndex.java:100)
at com.intellij.psi.stubs.StubIndex.getElements(StubIndex.java:88)
at com.intellij.psi.impl.java.stubs.index.JavaFullClassNameIndex.get(JavaFullClassNameIndex.java:30)
at com.intellij.psi.impl.file.impl.JavaFileManagerImpl.doFindClasses(JavaFileManagerImpl.java:84)
at com.intellij.psi.impl.file.impl.JavaFileManagerImpl.findClass(JavaFileManagerImpl.java:110)
at com.intellij.psi.impl.PsiElementFinderImpl.findClass(PsiElementFinderImpl.java:51)
at com.intellij.psi.impl.JavaPsiFacadeImpl.doFindClass(JavaPsiFacadeImpl.java:91)
at com.intellij.psi.impl.JavaPsiFacadeImpl.findClass(JavaPsiFacadeImpl.java:69)
at com.github.wangji92.arthas.plugin.utils.OgnlPsUtils.psiElementInEnum(OgnlPsUtils.java:554)
... 59 more

Watch Spring context invoke method field

Watch Spring Context Invoke Method Field 命令

右键选择需要调用的spring bean 的方法或者 字段的信息
image

获取命令

image
没有错,这个和 Static spring context invoke method field 一样的,只是这里的获取spring context的路径不一样,这里通过watch 去获取spring context ** watch 必须要被触发一次才能进行调用哦**

watch -x 3 -n 3  org.springframework.web.servlet.DispatcherServlet doDispatch '@org.springframework.web.context.support.WebApplicationContextUtils@getWebApplicationContext(params[0].getServletContext()).getBean("controllerTest").test()'

image
触发调用一下这个接口,必须要触发一下接口的调用,任意接口都可以,由于这里watch的是org.springframework.web.servlet.DispatcherServlet doDispatch 因此都可以
image
image
效果如下
image

help watch

the content you want to watch, written by ognl. 由于这里是被ognl 处理的,所以可以支持ognl的表达式去处理哦。

[arthas@21289]$ help watch
 USAGE:
   watch [-b] [-e] [-x <value>] [-f] [-h] [-n <value>] [-E] [-M <value>] [-s] class-pattern method-pattern
 express [condition-express]

 SUMMARY:
   Display the input/output parameter, return object, and thrown exception of specified method invocation
   The express may be one of the following expression (evaluated dynamically):
           target : the object
            clazz : the object's class
           method : the constructor or method
           params : the parameters array of method
     params[0..n] : the element of parameters array
        returnObj : the returned object of method
         throwExp : the throw exception of method
         isReturn : the method ended by return
          isThrow : the method ended by throwing exception
            #cost : the execution time in ms of method invocation
 Examples:
   watch -b org.apache.commons.lang.StringUtils isBlank params
   watch -f org.apache.commons.lang.StringUtils isBlank returnObj
   watch org.apache.commons.lang.StringUtils isBlank '{params, target, returnObj}' -x 2
   watch -bf *StringUtils isBlank params
   watch *StringUtils isBlank params[0]
   watch *StringUtils isBlank params[0] params[0].length==1
   watch *StringUtils isBlank params '#cost>100'
   watch -E -b org\.apache\.commons\.lang\.StringUtils isBlank params[0]

 WIKI:
   https://alibaba.github.io/arthas/watch

 OPTIONS:
 -b, --before                        Watch before invocation
 -e, --exception                     Watch after throw exception
 -x, --expand <value>                Expand level of object (1 by default)
 -f, --finish                        Watch after invocation, enable by default
 -h, --help                          this help
 -n, --limits <value>                Threshold of execution times
 -E, --regex                         Enable regular expression to match (wildcard matching by default)
 -M, --sizeLimit <value>             Upper size limit in bytes for the result (10 * 1024 * 1024 by default)
 -s, --success                       Watch after successful invocation
 <class-pattern>                     The full qualified class name you want to watch
 <method-pattern>                    The method name you want to watch
 <express>                           the content you want to watch, written by ognl.
                                     Examples:
                                       params
                                       params[0]
                                       'params[0]+params[1]'
                                       '{params[0], target, returnObj}'
                                       returnObj
                                       throwExp
                                       target
                                       clazz
                                       method

 <condition-express>                 Conditional expression in ognl style, for example:
                                       TRUE  : 1==1
                                       TRUE  : true
                                       FALSE : false
                                       TRUE  : 'params.length>=0'
                                       FALSE : 1==2

可以参考学习的网址

ognl 官方
ognl 特殊用法
ognl 最佳实践

other

这里watch的是接口的分发的入口类,一般只要watch 执行 ognl的spring context 表达式都会成功的,调用方法要注意安全哦。

文档需要更新

toLowerFristChar 应该是 toLowerFirstChar 的误写,并且在英语中,这个方法应该起名为 uncapitalize(参考这里)。

[arthas] get is enum error

[arthas] get is enum error

java.lang.Throwable: Control-flow exceptions (like ProcessCanceledException) should never be logged: ignore for explicitly started processes or rethrow to handle on the outer process level
at com.intellij.openapi.diagnostic.Logger.ensureNotControlFlow(Logger.java:234)
at com.intellij.idea.IdeaLogger.doLogError(IdeaLogger.java:198)
at com.intellij.idea.IdeaLogger.error(IdeaLogger.java:189)
at com.intellij.openapi.diagnostic.Logger.error(Logger.java:204)
at com.github.wangji92.arthas.plugin.utils.OgnlPsUtils.psiElementInEnum(OgnlPsUtils.java:564)
at com.github.wangji92.arthas.plugin.action.arthas.ArthasHotRedefineCommandAction.lambda$update$0(ArthasHotRedefineCommandAction.java:70)
at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:176)
at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195)
at java.base/java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:948)
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:913)
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:578)
at com.github.wangji92.arthas.plugin.action.arthas.ArthasHotRedefineCommandAction.update(ArthasHotRedefineCommandAction.java:70)
at com.intellij.openapi.actionSystem.ex.ActionUtil.lambda$performDumbAwareUpdate$0(ActionUtil.java:130)
at com.intellij.openapi.actionSystem.ex.ActionUtil.performDumbAwareUpdate(ActionUtil.java:144)
at com.intellij.openapi.actionSystem.impl.ActionUpdater.doUpdate(ActionUpdater.java:592)
at com.intellij.openapi.actionSystem.impl.ActionUpdater.lambda$updateActionReal$7(ActionUpdater.java:132)
at com.intellij.openapi.actionSystem.impl.ActionUpdater.lambda$callAction$9(ActionUpdater.java:187)
at com.intellij.openapi.progress.ProgressManager.lambda$runProcess$0(ProgressManager.java:57)
at com.intellij.openapi.progress.impl.CoreProgressManager.lambda$runProcess$2(CoreProgressManager.java:183)
at com.intellij.openapi.progress.impl.CoreProgressManager.registerIndicatorAndRun(CoreProgressManager.java:705)
at com.intellij.openapi.progress.impl.CoreProgressManager.executeProcessUnderProgress(CoreProgressManager.java:647)
at com.intellij.openapi.progress.impl.ProgressManagerImpl.executeProcessUnderProgress(ProgressManagerImpl.java:63)
at com.intellij.openapi.progress.impl.CoreProgressManager.runProcess(CoreProgressManager.java:170)
at com.intellij.openapi.progress.ProgressManager.runProcess(ProgressManager.java:57)
at com.intellij.openapi.actionSystem.impl.ActionUpdater.lambda$callAction$10(ActionUpdater.java:185)
at com.intellij.openapi.actionSystem.impl.ActionUpdateEdtExecutor.lambda$computeOnEdt$0(ActionUpdateEdtExecutor.java:45)
at com.intellij.openapi.actionSystem.impl.Utils.lambda$expandActionGroupFastTrack$3(Utils.java:221)
at com.intellij.openapi.actionSystem.impl.Utils.runLoopAndWaitForFuture(Utils.java:524)
at com.intellij.openapi.actionSystem.impl.Utils.expandActionGroupFastTrack(Utils.java:219)
at com.intellij.openapi.actionSystem.impl.Utils.expandActionGroupImpl(Utils.java:149)
at com.intellij.openapi.actionSystem.impl.Utils.fillMenu(Utils.java:243)
at com.intellij.openapi.actionSystem.impl.ActionMenu.fillMenuInner(ActionMenu.java:345)
at com.intellij.openapi.actionSystem.impl.Utils.performWithRetries(Utils.java:564)
at com.intellij.openapi.actionSystem.impl.ActionMenu.fillMenu(ActionMenu.java:324)
at com.intellij.openapi.actionSystem.impl.ActionMenu$MenuListenerImpl.menuSelected(ActionMenu.java:287)
at com.intellij.openapi.actionSystem.impl.ActionMenu$MenuListenerImpl.stateChanged(ActionMenu.java:225)
at java.desktop/javax.swing.DefaultButtonModel.fireStateChanged(DefaultButtonModel.java:352)
at java.desktop/javax.swing.DefaultButtonModel.setSelected(DefaultButtonModel.java:234)
at java.desktop/javax.swing.JMenu.setSelected(JMenu.java:291)
at java.desktop/com.apple.laf.ScreenMenu$2.run(ScreenMenu.java:137)
at java.desktop/sun.lwawt.macosx.LWCToolkit$CancelableRunnable.run(LWCToolkit.java:677)
at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:303)
at java.desktop/sun.awt.AWTThreading$4.dispatch(AWTThreading.java:218)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:776)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:727)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:95)
at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:751)
at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:749)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:748)
at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.java:885)
at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:754)
at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$6(IdeEventQueue.java:441)
at com.intellij.openapi.progress.impl.CoreProgressManager.computePrioritized(CoreProgressManager.java:825)
at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$7(IdeEventQueue.java:440)
at com.intellij.openapi.application.impl.ApplicationImpl.runIntendedWriteActionOnCurrentThread(ApplicationImpl.java:794)
at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:492)
at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
Caused by: com.intellij.openapi.progress.ProcessCanceledException
at com.intellij.util.SlowOperations.assertSlowOperationsAreAllowed(SlowOperations.java:79)
at com.intellij.util.indexing.FileBasedIndexImpl.ensureUpToDate(FileBasedIndexImpl.java:754)
at com.intellij.psi.stubs.StubIndexImpl.getContainingIds(StubIndexImpl.java:501)
at com.intellij.psi.stubs.StubIndexImpl.processElements(StubIndexImpl.java:305)
at com.intellij.psi.stubs.StubIndex.getElements(StubIndex.java:100)
at com.intellij.psi.stubs.StubIndex.getElements(StubIndex.java:88)
at com.intellij.psi.impl.java.stubs.index.JavaFullClassNameIndex.get(JavaFullClassNameIndex.java:30)
at com.intellij.psi.impl.file.impl.JavaFileManagerImpl.doFindClasses(JavaFileManagerImpl.java:84)
at com.intellij.psi.impl.file.impl.JavaFileManagerImpl.findClass(JavaFileManagerImpl.java:110)
at com.intellij.psi.impl.PsiElementFinderImpl.findClass(PsiElementFinderImpl.java:51)
at com.intellij.psi.impl.JavaPsiFacadeImpl.doFindClass(JavaPsiFacadeImpl.java:91)
at com.intellij.psi.impl.JavaPsiFacadeImpl.findClass(JavaPsiFacadeImpl.java:69)
at com.github.wangji92.arthas.plugin.utils.OgnlPsUtils.psiElementInEnum(OgnlPsUtils.java:554)
... 65 more

arthas 如何 watch 构造函数-插件不支持

如何 watch 构造函数

watch com.wangji92.arthas.plugin.demo.controller.User <init>

arthas idea 生成的效果如下 这个有问题

watch com.wangji92.arthas.plugin.demo.controller.User User '{params,returnObj,throwExp}' -v -n 5 -x 3 '1==1'

Logger 日志级别动态更新

Logger 日志 动态更新

logger 日志动态更新是从断岭 arthas Arthas抽丝剥茧深入应用 直播地址,代码地址 中了解到原来logger 还能这么使用,更多可以参考官方文档

[arthas@72097]$ help logger
 USAGE:
   logger [-c <value>] [-h] [--include-no-appender] [-l <value>] [-n <value>]

 SUMMARY:
   Print logger info, and update the logger level

 Examples:
   logger
   logger -c 327a647b
   logger -c 327a647b --name ROOT --level debug
   logger --include-no-appender

 WIKI:
   https://alibaba.github.io/arthas/logger

 OPTIONS:
 -c, --classloader <value>                                  classLoader hashcode, if no value is set, default value is SystemClassLoader
 -h, --help                                                 this help
     --include-no-appender                                  include the loggers don't have appender, default value false
 -l, --level <value>                                        set logger level
 -n, --name <value>                                         logger name

想法

原来logger 还能这么使用?知道了这个自己也亲自实践了一下直播中的内容,发现挺好使用的,我在想怎么和arthas idea 插件结合起来使用,譬如下面的这个定时触发的功能,动态的修改日志的等级。打印不同的日志出来。
trace > debug > info > warn> error
level 在trace 会打印所有的信息
level 在debug 会打印 debug info warn error
level 在info 会打印 info warn error
level 在warn 会打印 warn error
level 在error 会打印 error

感觉挺好用的,线上要修改日志的时候挺方便的,这个时候找到具体的类,就可以操作了...arthas idea plugin的老套路就可以使用了,将name ,-c hash值 定向的修改logger的日志级别。
demo 地址 可以自己下载下来玩玩

logger --name com.wangji92.arthas.plugin.demo.controller.LoggerDemo --level trace -c 18b4aac2
package com.wangji92.arthas.plugin.demo.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

/**
 * 体验一下修改logger的等级
 *
 * @author 汪小哥
 * @date 18-04-2020
 */
@Slf4j
@Component
public class LoggerDemo {

    /**
     * logger --name com.wangji92.arthas.plugin.demo.controller.LoggerDemo --level trace -c 18b4aac2
     */
    @Scheduled(initialDelay = 1000, fixedRate = 5000)
    public void sample() {
        log.trace("....trace");
        log.debug("......debug");
        log.warn("........info");
        log.info("..........warn");
        log.error("............error");
    }
}

实践

image

获取hash classloader值

[arthas@72097]$ logger --name com.wangji92.arthas.plugin.demo.controller.LoggerDemo
 name                          com.wangji92.arthas.plugin.demo.controller.LoggerDemo
 class                         ch.qos.logback.classic.Logger
 classLoader                   sun.misc.Launcher$AppClassLoader@18b4aac2
 classLoaderHash               18b4aac2
 level                         INFO
 effectiveLevel                INFO
 additivity                    true
 codeSource                    file:/Users/wangji/.m2/repository/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar

更新logger level

默认logger level 为info,修改为trace

[arthas@72097]$ logger --name com.wangji92.arthas.plugin.demo.controller.LoggerDemo --level trace -c 18b4aac2
Update logger level success.
2020-04-18 23:55:27.458 TRACE 72097 --- [   scheduling-1] c.w.a.plugin.demo.controller.LoggerDemo  : ....trace
2020-04-18 23:55:27.458 DEBUG 72097 --- [   scheduling-1] c.w.a.plugin.demo.controller.LoggerDemo  : ......debug
2020-04-18 23:55:27.459  WARN 72097 --- [   scheduling-1] c.w.a.plugin.demo.controller.LoggerDemo  : ........warn
2020-04-18 23:55:27.459  INFO 72097 --- [   scheduling-1] c.w.a.plugin.demo.controller.LoggerDemo  : ..........info
2020-04-18 23:55:27.459 ERROR 72097 --- [   scheduling-1] c.w.a.plugin.demo.controller.LoggerDemo  : ............error

总结

最后就可以随便的修改了..和static spring context的类似。

Idea redefine 菜单报错

插件版本:2.32
idea版本:2021.2.3(Ultimate Edition) Build #IU-212.5457.46
mac版本:macOS 10.15.7

redefine 是我用的最多的功能了,每次使用都会报个错出来。
有时候生成的脚本执行以后也不生效,没有成功替换。
企业微信截图_dd8f2660-eabd-458b-92df-b9de3fe66fec

报错

Do not request resource from classloader using path with leading slash

com.intellij.diagnostic.PluginException: /template/arthas-idea-plugin-hot-swap.sh [Plugin: com.github.wangji92.arthas.plugin]
	at com.intellij.ide.plugins.cl.PluginClassLoader.findResource(PluginClassLoader.java:472)
	at com.intellij.ide.plugins.cl.PluginClassLoader.getResourceAsStream(PluginClassLoader.java:462)
	at com.github.wangji92.arthas.plugin.utils.IoUtils.getResourceFile(IoUtils.java:29)
	at com.github.wangji92.arthas.plugin.utils.StringUtils.stringSubstitutorFromFilePath(StringUtils.java:39)
	at com.github.wangji92.arthas.plugin.action.arthas.ArthasHotRedefineCommandAction.lambda$actionPerformed$3(ArthasHotRedefineCommandAction.java:173)
	at com.intellij.openapi.application.WriteAction.lambda$runAndWait$2(WriteAction.java:123)
	at com.intellij.openapi.application.impl.ApplicationImpl.runWriteActionWithClass(ApplicationImpl.java:924)
	at com.intellij.openapi.application.impl.ApplicationImpl.runWriteAction(ApplicationImpl.java:950)
	at com.intellij.openapi.application.WriteAction.compute(WriteAction.java:104)
	at com.intellij.openapi.application.WriteAction.lambda$computeAndWait$3(WriteAction.java:153)
	at com.intellij.openapi.application.WriteThread.lambda$submit$0(WriteThread.java:28)
	at com.intellij.openapi.application.WriteThread.lambda$submit$1(WriteThread.java:45)
	at com.intellij.openapi.application.TransactionGuardImpl.runWithWritingAllowed(TransactionGuardImpl.java:214)
	at com.intellij.openapi.application.TransactionGuardImpl.access$200(TransactionGuardImpl.java:21)
	at com.intellij.openapi.application.TransactionGuardImpl$2.run(TransactionGuardImpl.java:196)
	at com.intellij.openapi.application.impl.ApplicationImpl.runIntendedWriteActionOnCurrentThread(ApplicationImpl.java:794)
	at com.intellij.openapi.application.impl.ApplicationImpl.lambda$invokeLaterOnWriteThread$10(ApplicationImpl.java:783)
	at com.intellij.openapi.application.impl.FlushQueue.doRun(FlushQueue.java:84)
	at com.intellij.openapi.application.impl.FlushQueue.runNextEvent(FlushQueue.java:133)
	at com.intellij.openapi.application.impl.FlushQueue.flushNow(FlushQueue.java:46)
	at com.intellij.openapi.application.impl.FlushQueue$FlushNow.run(FlushQueue.java:189)
	at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:313)
	at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:776)
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:727)
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
	at java.base/java.security.AccessController.doPrivileged(Native Method)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
	at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:746)
	at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.java:885)
	at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:754)
	at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$6(IdeEventQueue.java:441)
	at com.intellij.openapi.progress.impl.CoreProgressManager.computePrioritized(CoreProgressManager.java:825)
	at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$7(IdeEventQueue.java:440)
	at com.intellij.openapi.application.impl.ApplicationImpl.runIntendedWriteActionOnCurrentThread(ApplicationImpl.java:794)
	at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:486)
	at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
	at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

请确保已安装 JDK 并在 ~/.bashrc 里面配置 JAVA_HOME,此外必须存在 JAVA_HOME/lib/tools.jar

macos版本:13.2.1
idea版本:IntelliJ IDEA 2022.1.1 (Ultimate Edition)

启动热部署服务出现报错:
Arthas 启动失败
请确保已安装 JDK 并在 ~/.bashrc 里面配置 JAVA_HOME,此外必须存在 JAVA_HOME/lib/tools.jar

macos系统里没有.bashrc文件,替代品是.zshrc文件。
检查了java环境是正常的,JAVA_HOME/lib/tools.jar这个文件是存在的。
本机在用户目录下新建了.bashrc文件也不行。

idea报错

java.lang.NullPointerException
	at com.github.wangji92.arthas.plugin.utils.OgnlPsUtils.getMethodName(OgnlPsUtils.java:350)
	at com.github.wangji92.arthas.plugin.action.arthas.BaseArthasPluginAction.actionPerformed(BaseArthasPluginAction.java:47)
	at com.intellij.openapi.actionSystem.ex.ActionUtil.lambda$performActionDumbAware$5(ActionUtil.java:273)
	at com.intellij.util.SlowOperations.lambda$allowSlowOperations$0(SlowOperations.java:77)
	at com.intellij.util.SlowOperations.allowSlowOperations(SlowOperations.java:64)
	at com.intellij.util.SlowOperations.allowSlowOperations(SlowOperations.java:76)
	at com.intellij.openapi.actionSystem.ex.ActionUtil.performActionDumbAware(ActionUtil.java:273)
	at com.intellij.openapi.actionSystem.impl.ActionMenuItem$ActionTransmitter.lambda$actionPerformed$0(ActionMenuItem.java:310)
	at com.intellij.openapi.wm.impl.FocusManagerImpl.runOnOwnContext(FocusManagerImpl.java:286)
	at com.intellij.openapi.wm.impl.IdeFocusManagerImpl.runOnOwnContext(IdeFocusManagerImpl.java:77)
	at com.intellij.openapi.actionSystem.impl.ActionMenuItem$ActionTransmitter.actionPerformed(ActionMenuItem.java:299)
	at java.desktop/javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1967)
	at com.intellij.openapi.actionSystem.impl.ActionMenuItem.lambda$fireActionPerformed$0(ActionMenuItem.java:110)
	at com.intellij.openapi.application.TransactionGuardImpl.performUserActivity(TransactionGuardImpl.java:95)
	at com.intellij.openapi.actionSystem.impl.ActionMenuItem.fireActionPerformed(ActionMenuItem.java:110)
	at com.intellij.ui.plaf.beg.BegMenuItemUI.doClick(BegMenuItemUI.java:515)
	at com.intellij.ui.plaf.beg.BegMenuItemUI$MyMouseInputHandler.mouseReleased(BegMenuItemUI.java:545)
	at java.desktop/java.awt.Component.processMouseEvent(Component.java:6652)
	at java.desktop/javax.swing.JComponent.processMouseEvent(JComponent.java:3345)
	at java.desktop/java.awt.Component.processEvent(Component.java:6417)
	at java.desktop/java.awt.Container.processEvent(Container.java:2263)
	at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:5027)
	at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2321)
	at java.desktop/java.awt.Component.dispatchEvent(Component.java:4859)
	at java.desktop/java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4918)
	at java.desktop/java.awt.LightweightDispatcher.processMouseEvent(Container.java:4547)
	at java.desktop/java.awt.LightweightDispatcher.dispatchEvent(Container.java:4488)
	at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2307)
	at java.desktop/java.awt.Window.dispatchEventImpl(Window.java:2784)
	at java.desktop/java.awt.Component.dispatchEvent(Component.java:4859)
	at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:778)
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:727)
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
	at java.base/java.security.AccessController.doPrivileged(Native Method)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:95)
	at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:751)
	at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:749)
	at java.base/java.security.AccessController.doPrivileged(Native Method)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
	at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:748)
	at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.java:969)
	at com.intellij.ide.IdeEventQueue.dispatchMouseEvent(IdeEventQueue.java:906)
	at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:836)
	at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$8(IdeEventQueue.java:449)
	at com.intellij.openapi.progress.impl.CoreProgressManager.computePrioritized(CoreProgressManager.java:808)
	at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$9(IdeEventQueue.java:448)
	at com.intellij.openapi.application.impl.ApplicationImpl.runIntendedWriteActionOnCurrentThread(ApplicationImpl.java:781)
	at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:502)
	at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
	at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

Slow operations exception when open a new project everytime

IntelliJ IDEA 2021.2.2 (Ultimate Edition)
macOS 11.6
com.github.wangji92.arthas.plugin (2.36), plugin version 2.36

image

stack:
java.lang.Throwable: Slow operations are prohibited on EDT. See SlowOperations.assertSlowOperationsAreAllowed javadoc.
at com.intellij.openapi.diagnostic.Logger.error(Logger.java:182)
at com.intellij.util.SlowOperations.assertSlowOperationsAreAllowed(SlowOperations.java:110)
at com.intellij.util.indexing.FileBasedIndexImpl.ensureUpToDate(FileBasedIndexImpl.java:754)
at com.intellij.psi.stubs.StubIndexImpl.getContainingIds(StubIndexImpl.java:501)
at com.intellij.psi.stubs.StubIndexImpl.processElements(StubIndexImpl.java:305)
at com.intellij.psi.stubs.StubIndex.getElements(StubIndex.java:100)
at com.intellij.psi.stubs.StubIndex.getElements(StubIndex.java:88)
at com.intellij.psi.impl.java.stubs.index.JavaFullClassNameIndex.get(JavaFullClassNameIndex.java:30)
at com.intellij.psi.impl.file.impl.JavaFileManagerImpl.doFindClasses(JavaFileManagerImpl.java:84)
at com.intellij.psi.impl.file.impl.JavaFileManagerImpl.findClass(JavaFileManagerImpl.java:110)
at com.intellij.psi.impl.PsiElementFinderImpl.findClass(PsiElementFinderImpl.java:51)
at com.intellij.psi.impl.JavaPsiFacadeImpl.doFindClass(JavaPsiFacadeImpl.java:91)
at com.intellij.psi.impl.JavaPsiFacadeImpl.findClass(JavaPsiFacadeImpl.java:69)
at com.github.wangji92.arthas.plugin.utils.OgnlPsUtils.psiElementInEnum(OgnlPsUtils.java:554)
at com.github.wangji92.arthas.plugin.action.arthas.ArthasHotRedefineCommandAction.lambda$update$0(ArthasHotRedefineCommandAction.java:70)
at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:176)
at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195)
at java.base/java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:948)
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:913)
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:578)
at com.github.wangji92.arthas.plugin.action.arthas.ArthasHotRedefineCommandAction.update(ArthasHotRedefineCommandAction.java:70)
at com.intellij.openapi.actionSystem.ex.ActionUtil.lambda$performDumbAwareUpdate$0(ActionUtil.java:130)
at com.intellij.openapi.actionSystem.ex.ActionUtil.performDumbAwareUpdate(ActionUtil.java:144)
at com.intellij.openapi.actionSystem.impl.ActionUpdater.doUpdate(ActionUpdater.java:584)
at com.intellij.openapi.actionSystem.impl.ActionUpdater.lambda$updateActionReal$7(ActionUpdater.java:132)
at com.intellij.openapi.actionSystem.impl.ActionUpdater.lambda$callAction$9(ActionUpdater.java:187)
at com.intellij.openapi.progress.ProgressManager.lambda$runProcess$0(ProgressManager.java:57)
at com.intellij.openapi.progress.impl.CoreProgressManager.lambda$runProcess$2(CoreProgressManager.java:183)
at com.intellij.openapi.progress.impl.CoreProgressManager.registerIndicatorAndRun(CoreProgressManager.java:705)
at com.intellij.openapi.progress.impl.CoreProgressManager.executeProcessUnderProgress(CoreProgressManager.java:647)
at com.intellij.openapi.progress.impl.ProgressManagerImpl.executeProcessUnderProgress(ProgressManagerImpl.java:63)
at com.intellij.openapi.progress.impl.CoreProgressManager.runProcess(CoreProgressManager.java:170)
at com.intellij.openapi.progress.ProgressManager.runProcess(ProgressManager.java:57)
at com.intellij.openapi.actionSystem.impl.ActionUpdater.lambda$callAction$10(ActionUpdater.java:185)
at com.intellij.openapi.actionSystem.impl.ActionUpdateEdtExecutor.lambda$computeOnEdt$0(ActionUpdateEdtExecutor.java:45)
at com.intellij.openapi.application.TransactionGuardImpl$2.run(TransactionGuardImpl.java:199)
at com.intellij.openapi.application.impl.ApplicationImpl.runIntendedWriteActionOnCurrentThread(ApplicationImpl.java:794)
at com.intellij.openapi.application.impl.ApplicationImpl.lambda$invokeLater$4(ApplicationImpl.java:350)
at com.intellij.openapi.application.impl.FlushQueue.doRun(FlushQueue.java:84)
at com.intellij.openapi.application.impl.FlushQueue.runNextEvent(FlushQueue.java:133)
at com.intellij.openapi.application.impl.FlushQueue.flushNow(FlushQueue.java:46)
at com.intellij.openapi.application.impl.FlushQueue$FlushNow.run(FlushQueue.java:189)
at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:313)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:776)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:727)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:746)
at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.java:885)
at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:754)
at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$6(IdeEventQueue.java:441)
at com.intellij.openapi.progress.impl.CoreProgressManager.computePrioritized(CoreProgressManager.java:825)
at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$7(IdeEventQueue.java:440)
at com.intellij.openapi.application.impl.ApplicationImpl.runIntendedWriteActionOnCurrentThread(ApplicationImpl.java:794)
at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:486)
at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

[arthas] get is enum error

idea版本 2021.3
arthas idea版本 2.33
`[arthas] get is enum error

java.lang.Throwable: Control-flow exceptions (like ProcessCanceledException) should never be logged: ignore for explicitly started processes or rethrow to handle on the outer process level
at com.intellij.openapi.diagnostic.Logger.ensureNotControlFlow(Logger.java:234)
at com.intellij.idea.IdeaLogger.doLogError(IdeaLogger.java:210)
at com.intellij.idea.IdeaLogger.error(IdeaLogger.java:189)
at com.intellij.openapi.diagnostic.Logger.error(Logger.java:204)
at com.github.wangji92.arthas.plugin.utils.OgnlPsUtils.psiElementInEnum(OgnlPsUtils.java:564)
at com.github.wangji92.arthas.plugin.action.arthas.ArthasHotRedefineCommandAction.lambda$update$0(ArthasHotRedefineCommandAction.java:70)
at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:176)
at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195)
at java.base/java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:948)
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:913)
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:578)
at com.github.wangji92.arthas.plugin.action.arthas.ArthasHotRedefineCommandAction.update(ArthasHotRedefineCommandAction.java:70)
at com.intellij.openapi.actionSystem.ex.ActionUtil.lambda$performDumbAwareUpdate$0(ActionUtil.java:131)
at com.intellij.openapi.actionSystem.ex.ActionUtil.performDumbAwareUpdate(ActionUtil.java:145)
at com.intellij.openapi.actionSystem.impl.ActionUpdater.doUpdate(ActionUpdater.java:602)
at com.intellij.openapi.actionSystem.impl.ActionUpdater.lambda$updateActionReal$7(ActionUpdater.java:126)
at com.intellij.openapi.actionSystem.impl.ActionUpdater.lambda$callAction$8(ActionUpdater.java:191)
at com.intellij.openapi.progress.ProgressManager.lambda$runProcess$0(ProgressManager.java:57)
at com.intellij.openapi.progress.impl.CoreProgressManager.lambda$runProcess$2(CoreProgressManager.java:188)
at com.intellij.openapi.progress.impl.CoreProgressManager.lambda$executeProcessUnderProgress$12(CoreProgressManager.java:624)
at com.intellij.openapi.progress.impl.CoreProgressManager.registerIndicatorAndRun(CoreProgressManager.java:698)
at com.intellij.openapi.progress.impl.CoreProgressManager.computeUnderProgress(CoreProgressManager.java:646)
at com.intellij.openapi.progress.impl.CoreProgressManager.executeProcessUnderProgress(CoreProgressManager.java:623)
at com.intellij.openapi.progress.impl.ProgressManagerImpl.executeProcessUnderProgress(ProgressManagerImpl.java:66)
at com.intellij.openapi.progress.impl.CoreProgressManager.runProcess(CoreProgressManager.java:175)
at com.intellij.openapi.progress.ProgressManager.runProcess(ProgressManager.java:57)
at com.intellij.openapi.actionSystem.impl.ActionUpdater.lambda$callAction$9(ActionUpdater.java:189)
at com.intellij.openapi.actionSystem.impl.ActionUpdateEdtExecutor.lambda$computeOnEdt$0(ActionUpdateEdtExecutor.java:45)
at com.intellij.openapi.actionSystem.impl.Utils.lambda$expandActionGroupFastTrack$3(Utils.java:244)
at com.intellij.openapi.actionSystem.impl.Utils.runLoopAndWaitForFuture(Utils.java:575)
at com.intellij.openapi.actionSystem.impl.Utils.expandActionGroupFastTrack(Utils.java:242)
at com.intellij.openapi.actionSystem.impl.Utils.expandActionGroupImpl(Utils.java:170)
at com.intellij.openapi.actionSystem.impl.Utils.fillMenu(Utils.java:266)
at com.intellij.openapi.actionSystem.impl.ActionMenu.fillMenuInner(ActionMenu.java:380)
at com.intellij.openapi.actionSystem.impl.Utils.performWithRetries(Utils.java:613)
at com.intellij.openapi.actionSystem.impl.ActionMenu.fillMenu(ActionMenu.java:359)
at com.intellij.openapi.actionSystem.impl.ActionMenu.setPopupMenuVisible(ActionMenu.java:330)
at java.desktop/javax.swing.JPopupMenu.menuSelectionChanged(JPopupMenu.java:1484)
at java.desktop/javax.swing.MenuSelectionManager.setSelectedPath(MenuSelectionManager.java:129)
at java.desktop/javax.swing.plaf.basic.BasicMenuUI.appendPath(BasicMenuUI.java:258)
at java.desktop/javax.swing.plaf.basic.BasicMenuUI$Actions.actionPerformed(BasicMenuUI.java:316)
at java.desktop/javax.swing.Timer.fireActionPerformed(Timer.java:317)
at java.desktop/javax.swing.Timer$DoPostEvent.run(Timer.java:249)
at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:313)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:776)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:727)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:746)
at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.java:891)
at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:760)
at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$6(IdeEventQueue.java:447)
at com.intellij.openapi.progress.impl.CoreProgressManager.computePrioritized(CoreProgressManager.java:818)
at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$7(IdeEventQueue.java:446)
at com.intellij.openapi.application.impl.ApplicationImpl.runIntendedWriteActionOnCurrentThread(ApplicationImpl.java:805)
at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:498)
at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
Caused by: com.intellij.openapi.progress.ProcessCanceledException
at com.intellij.util.SlowOperations.assertSlowOperationsAreAllowed(SlowOperations.java:74)
at com.intellij.util.indexing.FileBasedIndexImpl.ensureUpToDate(FileBasedIndexImpl.java:784)
at com.intellij.psi.stubs.StubIndexImpl.getContainingIds(StubIndexImpl.java:514)
at com.intellij.psi.stubs.StubIndexImpl.processElements(StubIndexImpl.java:318)
at com.intellij.psi.stubs.StubIndex.getElements(StubIndex.java:100)
at com.intellij.psi.stubs.StubIndex.getElements(StubIndex.java:88)
at com.intellij.psi.impl.java.stubs.index.JavaFullClassNameIndex.get(JavaFullClassNameIndex.java:30)
at com.intellij.psi.impl.file.impl.JavaFileManagerImpl.doFindClasses(JavaFileManagerImpl.java:84)
at com.intellij.psi.impl.file.impl.JavaFileManagerImpl.findClass(JavaFileManagerImpl.java:110)
at com.intellij.psi.impl.PsiElementFinderImpl.findClass(PsiElementFinderImpl.java:40)
at com.intellij.psi.impl.JavaPsiFacadeImpl.doFindClass(JavaPsiFacadeImpl.java:91)
at com.intellij.psi.impl.JavaPsiFacadeImpl.findClass(JavaPsiFacadeImpl.java:69)
at com.github.wangji92.arthas.plugin.utils.OgnlPsUtils.psiElementInEnum(OgnlPsUtils.java:554)
... 61 more`

功能支持

image

你好, 由于服务是用Docker启动的, Docker容器image为openjdk:8u212-jdk, 是不带telnet及redis-cli的, 希望开发者能在使用剪切板功能时判断如无telnet工具, 可以选择是否强制执行。 不然docker里还需要再安装telnet命令。 这只是一个小小的建议哈~

静态脚本里面增加常用快捷脚本,eg 观察spring http请求耗时、观察jdbc 执行的sql

静态脚本里面增加常用快捷脚本

image

1、观察spring http 请求的响应时间

watch org.springframework.web.servlet.DispatcherServlet doService '{params[0].getRequestURI()+" "+ #cost}'  -n 5  -x 3 '#cost>1'
[arthas@12347]$ watch org.springframework.web.servlet.DispatcherServlet doService '{params[0].getRequestURI()+" "+ #cost}'  -n 5  -x 3 '#cost>1'
Press Q or Ctrl+C to abort.
Affect(class count: 1 , method count: 1) cost in 78 ms, listenerId: 2
method=org.springframework.web.servlet.DispatcherServlet.doService location=AtExit
ts=2022-10-19 22:31:59; [cost=12.672321ms] result=@ArrayList[
    @String[/user/findAll/test 12.672321],
]

2、观察spring 响应头信息

 watch org.springframework.web.servlet.DispatcherServlet doService '{params[0].getRequestURI()+"  header="+params[1].getHeaders("trace-id")}'  -n 10  -x 3 -f

```bash
[arthas@12347]$  watch org.springframework.web.servlet.DispatcherServlet doService '{params[0].getRequestURI()+"  header="+params[1].getHeaders("Content-Length")}'  -n 10  -x 3 -f
Press Q or Ctrl+C to abort.
method=org.springframework.web.servlet.DispatcherServlet.doService location=AtExit
ts=2022-10-19 22:33:43; [cost=9.305102ms] result=@ArrayList[
    @String[/favicon.ico  header=[946]],
]

3、观察mybatis sql

这个可能一次查询被调用很多次,比如mybatis的插件里面使用

watch org.apache.ibatis.mapping.BoundSql getSql '{returnObj,target.parameterObject,throwExp}'  -n 5  -x 3
[arthas@12347]$ watch org.apache.ibatis.mapping.BoundSql getSql '{returnObj,target.parameterObject,throwExp}'  -n 5  -x 3
Press Q or Ctrl+C to abort.
Affect(class count: 1 , method count: 1) cost in 68 ms, listenerId: 5
method=org.apache.ibatis.mapping.BoundSql.getSql location=AtExit
ts=2022-10-19 22:35:07; [cost=0.017394ms] result=@ArrayList[
    @String[select\n     \n     \n    \n    id, name, age, type\n   \n    from user\n     \n       \n    \n     WHERE (  name = ? )],
    @UserDoExample[
        orderByClause=null,
        distinct=@Boolean[false],
        oredCriteria=@ArrayList[
            @Criteria[com.boot.mybatis.mybatisdemo.model.dataobject.UserDoExample$Criteria@33262336],
        ],
    ],
    null,
]

可以过滤sql 如果你想table 名称

watch org.apache.ibatis.mapping.BoundSql getSql '{returnObj,target.parameterObject,throwExp}'  -n 5  -x 3 'returnObj.contains("table_name")'  -v
[arthas@12347]$ watch org.apache.ibatis.mapping.BoundSql getSql '{returnObj,target.parameterObject,throwExp}'  -n 5  -x 3 'returnObj.contains("user")'  -v
Press Q or Ctrl+C to abort.
Affect(class count: 1 , method count: 1) cost in 59 ms, listenerId: 7
Condition express: returnObj.contains("user") , result: true
method=org.apache.ibatis.mapping.BoundSql.getSql location=AtExit
ts=2022-10-19 22:37:08; [cost=0.038684ms] result=@ArrayList[
    @String[select\n     \n     \n    \n    id, name, age, type\n   \n    from user\n     \n       \n    \n     WHERE (  name = ? )],
    @UserDoExample[
        orderByClause=null,
        distinct=@Boolean[false],
        oredCriteria=@ArrayList[
            @Criteria[com.boot.mybatis.mybatisdemo.model.dataobject.UserDoExample$Criteria@200f4da5],
        ],
    ],
    null,
]
Condition express: returnObj.contains("user") , result: true

4、观察jdbc

watch java.sql.Connection prepareStatement '{params,throwExp}'  -n 5  -x 3  'clazz.getName().startsWith("com.mysql") and params.length==1' and #cost>1 

这个观察看不到参数

[arthas@12347]$ watch java.sql.Connection prepareStatement '{params,throwExp}'  -n 5  -x 3  'clazz.getName().startsWith("com.mysql") and params.length==1' and #cost>1
Press Q or Ctrl+C to abort.
Affect(class count: 4 , method count: 18) cost in 171 ms, listenerId: 8
method=com.mysql.cj.jdbc.ConnectionImpl.prepareStatement location=AtExit
ts=2022-10-19 22:38:10; [cost=6.708307ms] result=@ArrayList[
    @Object[][
        @String[select\n     \n     \n    \n    id, name, age, type\n   \n    from user\n     \n       \n    \n     WHERE (  name = ? )],
    ],
    null,
]

Clipboard Not

剪切板和 阿里云oss redis 配置互斥有问题,会使用阿里云oss 的配置

idea报错

[arthas] get is enum error

java.lang.Throwable: Control-flow exceptions (like ProcessCanceledException) should never be logged: ignore for explicitly started processes or rethrow to handle on the outer process level
at com.intellij.openapi.diagnostic.Logger.ensureNotControlFlow(Logger.java:234)
at com.intellij.idea.IdeaLogger.doLogError(IdeaLogger.java:210)
at com.intellij.idea.IdeaLogger.error(IdeaLogger.java:189)
at com.intellij.openapi.diagnostic.Logger.error(Logger.java:204)
at com.github.wangji92.arthas.plugin.utils.OgnlPsUtils.psiElementInEnum(OgnlPsUtils.java:564)
at com.github.wangji92.arthas.plugin.action.arthas.ArthasHotRedefineCommandAction.lambda$update$0(ArthasHotRedefineCommandAction.java:70)
at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:176)
at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195)
at java.base/java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:948)
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:913)
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:578)
at com.github.wangji92.arthas.plugin.action.arthas.ArthasHotRedefineCommandAction.update(ArthasHotRedefineCommandAction.java:70)
at com.intellij.openapi.actionSystem.ex.ActionUtil.lambda$performDumbAwareUpdate$0(ActionUtil.java:131)
at com.intellij.openapi.actionSystem.ex.ActionUtil.performDumbAwareUpdate(ActionUtil.java:145)
at com.intellij.openapi.actionSystem.impl.ActionUpdater.doUpdate(ActionUpdater.java:602)
at com.intellij.openapi.actionSystem.impl.ActionUpdater.lambda$updateActionReal$7(ActionUpdater.java:126)
at com.intellij.openapi.actionSystem.impl.ActionUpdater.lambda$callAction$8(ActionUpdater.java:191)
at com.intellij.openapi.progress.ProgressManager.lambda$runProcess$0(ProgressManager.java:57)
at com.intellij.openapi.progress.impl.CoreProgressManager.lambda$runProcess$2(CoreProgressManager.java:188)
at com.intellij.openapi.progress.impl.CoreProgressManager.lambda$executeProcessUnderProgress$12(CoreProgressManager.java:624)
at com.intellij.openapi.progress.impl.CoreProgressManager.registerIndicatorAndRun(CoreProgressManager.java:698)
at com.intellij.openapi.progress.impl.CoreProgressManager.computeUnderProgress(CoreProgressManager.java:646)
at com.intellij.openapi.progress.impl.CoreProgressManager.executeProcessUnderProgress(CoreProgressManager.java:623)
at com.intellij.openapi.progress.impl.ProgressManagerImpl.executeProcessUnderProgress(ProgressManagerImpl.java:66)
at com.intellij.openapi.progress.impl.CoreProgressManager.runProcess(CoreProgressManager.java:175)
at com.intellij.openapi.progress.ProgressManager.runProcess(ProgressManager.java:57)
at com.intellij.openapi.actionSystem.impl.ActionUpdater.lambda$callAction$9(ActionUpdater.java:189)
at com.intellij.openapi.actionSystem.impl.ActionUpdateEdtExecutor.lambda$computeOnEdt$0(ActionUpdateEdtExecutor.java:45)
at com.intellij.openapi.actionSystem.impl.Utils.lambda$expandActionGroupFastTrack$3(Utils.java:244)
at com.intellij.openapi.actionSystem.impl.Utils.runLoopAndWaitForFuture(Utils.java:575)
at com.intellij.openapi.actionSystem.impl.Utils.expandActionGroupFastTrack(Utils.java:242)
at com.intellij.openapi.actionSystem.impl.Utils.expandActionGroupImpl(Utils.java:170)
at com.intellij.openapi.actionSystem.impl.Utils.fillMenu(Utils.java:266)
at com.intellij.openapi.actionSystem.impl.ActionMenu.fillMenuInner(ActionMenu.java:380)
at com.intellij.openapi.actionSystem.impl.Utils.performWithRetries(Utils.java:613)
at com.intellij.openapi.actionSystem.impl.ActionMenu.fillMenu(ActionMenu.java:359)
at com.intellij.openapi.actionSystem.impl.ActionMenu.setPopupMenuVisible(ActionMenu.java:330)
at java.desktop/javax.swing.JPopupMenu.menuSelectionChanged(JPopupMenu.java:1484)
at java.desktop/javax.swing.MenuSelectionManager.setSelectedPath(MenuSelectionManager.java:129)
at java.desktop/javax.swing.plaf.basic.BasicMenuUI.appendPath(BasicMenuUI.java:258)
at java.desktop/javax.swing.plaf.basic.BasicMenuUI$Actions.actionPerformed(BasicMenuUI.java:316)
at java.desktop/javax.swing.Timer.fireActionPerformed(Timer.java:317)
at java.desktop/javax.swing.Timer$DoPostEvent.run(Timer.java:249)
at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:313)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:776)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:727)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:746)
at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.java:891)
at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:760)
at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$6(IdeEventQueue.java:447)
at com.intellij.openapi.progress.impl.CoreProgressManager.computePrioritized(CoreProgressManager.java:818)
at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$7(IdeEventQueue.java:446)
at com.intellij.openapi.application.impl.ApplicationImpl.runIntendedWriteActionOnCurrentThread(ApplicationImpl.java:805)
at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:498)
at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
Caused by: com.intellij.openapi.progress.ProcessCanceledException
at com.intellij.util.SlowOperations.assertSlowOperationsAreAllowed(SlowOperations.java:74)
at com.intellij.util.indexing.FileBasedIndexImpl.ensureUpToDate(FileBasedIndexImpl.java:784)
at com.intellij.psi.stubs.StubIndexImpl.getContainingIds(StubIndexImpl.java:514)
at com.intellij.psi.stubs.StubIndexImpl.processElements(StubIndexImpl.java:318)
at com.intellij.psi.stubs.StubIndex.getElements(StubIndex.java:100)
at com.intellij.psi.stubs.StubIndex.getElements(StubIndex.java:88)
at com.intellij.psi.impl.java.stubs.index.JavaFullClassNameIndex.get(JavaFullClassNameIndex.java:30)
at com.intellij.psi.impl.file.impl.JavaFileManagerImpl.doFindClasses(JavaFileManagerImpl.java:84)
at com.intellij.psi.impl.file.impl.JavaFileManagerImpl.findClass(JavaFileManagerImpl.java:110)
at com.intellij.psi.impl.PsiElementFinderImpl.findClass(PsiElementFinderImpl.java:40)
at com.intellij.psi.impl.JavaPsiFacadeImpl.doFindClass(JavaPsiFacadeImpl.java:91)
at com.intellij.psi.impl.JavaPsiFacadeImpl.findClass(JavaPsiFacadeImpl.java:69)
at com.github.wangji92.arthas.plugin.utils.OgnlPsUtils.psiElementInEnum(OgnlPsUtils.java:554)
... 61 more

条件表达式过滤常见使用+异步任务总结

条件表达式总结

问题

  • 只有特定的场景才会有bug ,如何排查bug?
  • 一天只出现一两次如何解决?

使用场景

条件表达式主要是用来过滤使用,比如某些场景只是在特定的参数才会出现,肯能会花费很多的时间去等待,这个时候可以使用条件表达式过滤 +异步任务

使用须知

在watch、trace、stack 等命令中都有条件表达式,不知道你是否用过哦!条件表达式的使用其实就是已知的信息进行逻辑运算(and or..等等),什么是已知信息,在使用arhtas的时候一定要理解他的核心参数 这些参数是我们可以利用来进行逻辑运算的核心参数,比如入参params、返回值returnObj,异常信息throwExp等等。当然除了这些参数你可能还可以通过获取静态的方法、字段获取信息来进行某些逻辑判断。比如必须是某个静态字段是这个值的情况下才ok。eg '@java.lang.String@serialVersionUID=-6849794470754667710L' 这里只是随便举例子,真实场景这种使用太少了...一般都是参数 对象的xxxClass.field='xxx' 条件才进行trace 、watch。
这些核心参数是在进行逻辑运算的时候通过传递给ognl执行上下文的入参信息,由此可以进行逻辑判断返回truce or false 来进行是否进行trace or watch 等等。

public class Advice {

    private final ClassLoader loader;
    private final Class<?> clazz;
    private final ArthasMethod method;
    private final Object target;
    private final Object[] params;
    private final Object returnObj;
    private final Throwable throwExp;

    private final static int ACCESS_BEFORE = 1;
    private final static int ACCESS_AFTER_RETUNING = 1 << 1;
    private final static int ACCESS_AFTER_THROWING = 1 << 2;

    private final boolean isBefore;
    private final boolean isThrow;
    private final boolean isReturn;
}

参考资料

活用ognl表达式
ognl 官方

条件表达式实践

基于arthas-plugin-demo 进行演示
如下的所有的场景都必须在条件表达式成立的情况下才会执行arthas的trace 、watch 等等命令,这个可以解决问题特定场景的问题。

入参长度大于0

 watch com.wangji92.arthas.plugin.demo.controller.CommonController traceE '{params,returnObj,throwExp}' -n 5 -x 3 'params.length >0'

返回值为String 且长度大于5

watch com.wangji92.arthas.plugin.demo.controller.CommonController traceE '{params,returnObj,throwExp}' -n 5 -x 3 'returnObj instanceof java.lang.String && returnObj.length>5'

有异常

watch com.wangji92.arthas.plugin.demo.controller.CommonController traceException '{params,returnObj,throwExp}' -n 5 -x 3 'throwExp != null'

第一个参数等于’name‘

watch com.wangji92.arthas.plugin.demo.controller.CommonController traceE '{params,returnObj,throwExp}' -n 5 -x 3 'params[0]=="name"'

参数对象

ognl 支持链式调用,你可以随意的进行这种判断 比如 params[0].xxxField.xxxField
如下是官方的一个例子
All OGNL expressions are evaluated in the context of a current object, and a chain simply uses the result of the previous link in the chain as the current object for the next one. You can extend a chain as long as you like. For example, this chain:

name.toCharArray()[0].numericValue.toString()

This expression follows these steps to evaluate:

  • extracts the name property of the initial, or root, object (which the user provides to OGNL through the OGNL context);
  • calls the toCharArray() method on the resulting String;
  • extracts the first character (the one at index 0) from the resulting array;
  • gets the numericValue property from that character (the character is represented as a Character object, and the Character class has a method called getNumericValue());
  • calls toString() on the resulting Integer object. The final result of this expression is the String returned by the last toString() call.

后台执行,一天只出现一次问题排查

可以通过使用异步任务来进行排查,这里我们就使用上面的命令吧结合条件表达式+异步任务

有问题写test.txt文件里面去 & 后台异步执行

watch com.wangji92.arthas.plugin.demo.controller.CommonController traceException '{params,returnObj,throwExp}' -n 5 -x 3 'throwExp != null' > test.txt &

这个时候使用quit 命令 退出arthas控制台,让arthas 服务继续运行(stop 会停止arthas 服务),等一段时间之后就可以来查看这个文件是否有异常信息进行相关的bug诊断。

ognl command or other get bean name error

ognl 命令获取spring bean的名称错误 ,当使用 org.springframework.context.annotation.Configuration(value = "xxxBeanName") 重新定义bean 的名称,不应该获取默认的class 首字母小写。

athas 命令输入中文字符乱码解决方案

众所周知,arthas的command line无法输入中文。连echo "你好"也做不到,会乱码。

但是很多时候我需要在表达式中使用中文的参数,这使得之前很多可以用vmtools或者静态spring的调用无法支持。

然而今天我突然想到,中文也是string,string就是byte数组。
然后我试着在arthas里输入
ognl 'new String({-60,-29,-70,-61}.toArray(), @java.nio.charset.Charset@forName("GBK"))'
输出了:你好

因此我想要一个功能,可以在idea中选中一段内容,右键后可以有某个选项把选中文字转为前面表达式里的内容。
可选编码就更好了,建议默认gbk,数组会短一些。

代码是否生效?反编译代码比较 -2.8版本支持

使用arthas jad 命令实现这个功能

根据 help jad 即可知道这个支持方法和整个类的源码反编译,一个类很大的时候支持方法很有用哦

USAGE:
   jad [-c <value>] [-h] [-E] [--source-only] class-pattern [method-name]

 SUMMARY:
   Decompile class

 EXAMPLES:
   jad java.lang.String
   jad java.lang.String toString
   jad --source-only java.lang.String
   jad -c 39eb305e org/apache/log4j/Logger
   jad -c 39eb305e -E org\\.apache\\.*\\.StringUtils

 WIKI:
   https://alibaba.github.io/arthas/jad

 OPTIONS:
 -c, --code <value>                                         The hash code of the special class's classLoader
 -h, --help                                                 this help
 -E, --regex                                                Enable regular expression to match (wildcard matching by default)
     --source-only                                          Output source code only
 <class-pattern>                                            Class name pattern, use either '.' or '/' as separator
 <method-name>                                              method name pattern, decompile a specific method instead of the whole class

演示一下Idea arthas 插件如何支持

选中方法、然后右键选中other、jad 即可获取命令
image

命令如下

jad --source-only com.wangji92.github.study.controller.FileOperationController downLoadByType

效果

image

热更新增加新的存储方式redis

解决热更新 没有阿里云oss 存储的囧困

  • 现实的情况 可能没有阿里云oss 使用,剪切板使用起来特别的麻烦!
  • 基本上的项目中都会存在redis key value 存储,可行性比较高,简单配置即可使用。
  • redis 获取工具直接使用 redis cli 方便简单,前提是服务器中有redis-cli 工具,自己安装。(前期考虑想使用 telnet 127.0.0.1 6379 直接连接redis 发现改造脚本比较复杂、shell 命令不好写,还要重新修改之前的热更新脚本,最后选择使用 redis cli)
echo `redis-cli -h '127.0.0.1' -p 6379 -a 123 get cacheKey` | todo arthas shell

实际效果

echo `redis-cli -h '127.0.0.1' -p 6379 -a 123  get arthasIdeaPluginRedefineCacheKey_c07c0524-fc23-4661-962d-c676ac717fd0`|base64 --decode >arthas-idea-plugin-redefine.sh;chmod a+x arthas-idea-plugin-redefine.sh;./arthas-idea-plugin-redefine.sh;

和之前的oss的使用体验保持一致

$ echo `redis-cli -h '127.0.0.1' -p 6379 -a 123  get arthasIdeaPluginRedefineCacheKey_c07c0524-fc23-4661-962d-c676ac717fd0`|base64 --decode >arthas-idea-plugin-redefine.sh;chmod a+x arthas-idea-plugin-redefine.sh;./arthas-idea-plugin-redefine.sh;
Warning: Using a password with '-a' option on the command line interface may not be safe.
***************************************************************************************************************
* arthas idea plugin redefine begin;start script path: /Users/wangji/Downloads/arthas-idea-plugin-redefine.sh *
***************************************************************************************************************

File /Users/wangji/opt/arthas/redefine/classes/com/wangji92/arthas/plugin/demo/controller/CommonController$1.class created.
base64Class decode to path /Users/wangji/opt/arthas/redefine/classes/com/wangji92/arthas/plugin/demo/controller/CommonController$1.class
File /Users/wangji/opt/arthas/redefine/classes/com/wangji92/arthas/plugin/demo/controller/CommonController.class created.
base64Class decode to path /Users/wangji/opt/arthas/redefine/classes/com/wangji92/arthas/plugin/demo/controller/CommonController.class
[INFO] JAVA_HOME: /Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/
* [1]: 15251 org.jetbrains.jps.cmdline.Launcher
  [2]: 15363 org.jetbrains.jps.cmdline.Launcher
  [3]: 15252 com.wangji92.arthas.plugin.demo.ArthasPluginDemoApplication
  [4]: 15338 org.jetbrains.jps.cmdline.Launcher
  [5]: 15402 org.jetbrains.idea.maven.server.RemoteMavenServer36
  [6]: 15339 com.intellij.idea.Main
  [7]: 8110
3
File /Users/wangji/opt/arthas/redefine/redefineArthas.out created.
arthas start command :/Users/wangji/opt/arthas/as.sh --select 15252  -c "redefine /Users/wangji/opt/arthas/redefine/classes/com/wangji92/arthas/plugin/demo/controller/CommonController$1.class /Users/wangji/opt/arthas/redefine/classes/com/wangji92/arthas/plugin/demo/controller/CommonController.class"  >/Users/wangji/opt/arthas/redefine/redefineArthas.out

real	0m0.188s
user	0m0.346s
sys	0m0.034s
Arthas script version: 3.4.1
[INFO] JAVA_HOME: /Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home
[INFO] Process 15252 already using port 3658
[INFO] Process 15252 already using port 8563
Arthas home: /Users/wangji/.arthas/lib/3.4.5/arthas
Calculating attach execution time...
Attaching to 15252 using version /Users/wangji/.arthas/lib/3.4.5/arthas...
Attach success.
  ,---.  ,------. ,--------.,--.  ,--.  ,---.   ,---.
 /  O  \ |  .--. ''--.  .--'|  '--'  | /  O  \ '   .-'
|  .-.  ||  '--'.'   |  |   |  .--.  ||  .-.  |`.  `-.
|  | |  ||  |\  \    |  |   |  |  |  ||  | |  |.-'    |
`--' `--'`--' '--'   `--'   `--'  `--'`--' `--'`-----'


wiki      https://arthas.aliyun.com/doc
tutorials https://arthas.aliyun.com/doc/arthas-tutorials.html
version   3.4.5
pid       15252
time      2021-01-01 18:51:18

ss | plaintextes/com/wangji92/arthas/plugin/demo/controller/CommonController.cla
redefine success, size: 1, classes:
com.wangji92.arthas.plugin.demo.controller.CommonController
[arthas@15252]$
***************************************
* arthas idea plugin redefine success *
***************************************

arthas idea plugin delete class file /Users/wangji/opt/arthas/redefine ok

最后

献给20210101 新年第一天,各位新年快乐!happy new year

shell script

java.lang.IllegalArgumentException: Argument for @NotNull parameter 'psiElement' of com/github/wangji92/arthas/plugin/utils/OgnlPsUtils.getMethodName must not be null
at com.github.wangji92.arthas.plugin.utils.OgnlPsUtils.$$$reportNull$$$0(OgnlPsUtils.java)
at com.github.wangji92.arthas.plugin.utils.OgnlPsUtils.getMethodName(OgnlPsUtils.java)
at com.github.wangji92.arthas.plugin.ui.ArthasShellScriptCommandDialog.initContextParam(ArthasShellScriptCommandDialog.java:89)
at com.github.wangji92.arthas.plugin.ui.ArthasShellScriptCommandDialog.(ArthasShellScriptCommandDialog.java:79)
at com.github.wangji92.arthas.plugin.action.arthas.ArthasShellScriptCommandAction.actionPerformed(ArthasShellScriptCommandAction.java:55)
at com.intellij.openapi.actionSystem.ex.ActionUtil$1.run(ActionUtil.java:220)
at com.intellij.openapi.actionSystem.ex.ActionUtil.performActionDumbAware(ActionUtil.java:237)
at com.intellij.openapi.actionSystem.impl.ActionMenuItem$ActionTransmitter.lambda$actionPerformed$0(ActionMenuItem.java:304)
at com.intellij.openapi.wm.impl.FocusManagerImpl.runOnOwnContext(FocusManagerImpl.java:307)
at com.intellij.openapi.wm.impl.IdeFocusManagerImpl.runOnOwnContext(IdeFocusManagerImpl.java:106)
at com.intellij.openapi.actionSystem.impl.ActionMenuItem$ActionTransmitter.actionPerformed(ActionMenuItem.java:294)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
at com.intellij.openapi.actionSystem.impl.ActionMenuItem.lambda$fireActionPerformed$0(ActionMenuItem.java:114)
at com.intellij.openapi.application.TransactionGuardImpl.runSyncTransaction(TransactionGuardImpl.java:88)
at com.intellij.openapi.application.TransactionGuardImpl.lambda$submitTransaction$1(TransactionGuardImpl.java:111)
at com.intellij.openapi.application.TransactionGuardImpl.submitTransaction(TransactionGuardImpl.java:120)
at com.intellij.openapi.application.TransactionGuard.submitTransaction(TransactionGuard.java:122)
at com.intellij.openapi.actionSystem.impl.ActionMenuItem.fireActionPerformed(ActionMenuItem.java:114)
at com.intellij.ui.plaf.beg.BegMenuItemUI.doClick(BegMenuItemUI.java:529)
at com.intellij.ui.plaf.beg.BegMenuItemUI.access$300(BegMenuItemUI.java:49)
at com.intellij.ui.plaf.beg.BegMenuItemUI$MyMouseInputHandler.mouseReleased(BegMenuItemUI.java:549)
at java.awt.Component.processMouseEvent(Component.java:6548)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3325)
at java.awt.Component.processEvent(Component.java:6313)
at java.awt.Container.processEvent(Container.java:2237)
at java.awt.Component.dispatchEventImpl(Component.java:4903)
at java.awt.Container.dispatchEventImpl(Container.java:2295)
at java.awt.Component.dispatchEvent(Component.java:4725)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4889)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4526)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4467)
at java.awt.Container.dispatchEventImpl(Container.java:2281)
at java.awt.Window.dispatchEventImpl(Window.java:2746)
at java.awt.Component.dispatchEvent(Component.java:4725)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:764)
at java.awt.EventQueue.access$500(EventQueue.java:98)
at java.awt.EventQueue$3.run(EventQueue.java:715)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:90)
at java.awt.EventQueue$4.run(EventQueue.java:737)
at java.awt.EventQueue$4.run(EventQueue.java:735)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:734)
at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.java:781)
at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:718)
at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:382)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.