Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

Arthas 3.1.0版本发布:在线教程、内存编译器和强大的自动补全 #508

Closed
hengyunabc opened this issue Feb 13, 2019 · 12 comments
Milestone

Comments

@hengyunabc
Copy link
Collaborator

hengyunabc commented Feb 13, 2019

Arthas

Arthas是Alibaba开源的Java诊断工具,深受开发者喜爱。
从Arthas上个版本发布,已经过去两个多月了,Arthas 3.1.0版本不仅带来大家投票出来的新LOGO,还带来强大的新功能和更好的易用性,下面一一介绍。

在线教程

在新版本Arthas里,增加了在线教程,用户可以在线运行Demo,一步步学习Arthas的各种用法,推荐新手尝试:

非常欢迎大家来完善这些教程。

增加内存编译器支持,在线编辑热更新代码

3.1.0版本里新增命令mc,不是方块游戏mc,而是Memory Compiler。

在之前版本里,增加了redefine命令,可以热更新字节码。但是有个不方便的地方:需要把.class文件上传到服务器上。

3.1.0版本里,结合jad/mc/redefine 可以完美实现热更新代码。

Arthas在线教程 里的UserController为例:

  1. 使用jad反编译代码

    jad --source-only com.example.demo.arthas.user.UserController > /tmp/UserController.java
  2. 使用vim编译代码

    当 user id 小于1时,也正常返回,不抛出异常:

        @GetMapping("/user/{id}")
        public User findUserById(@PathVariable Integer id) {
            logger.info("id: {}" , id);
    
            if (id != null && id < 1) {
                return new User(id, "name" + id);
                // throw new IllegalArgumentException("id < 1");
            } else {
                return new User(id, "name" + id);
            }
        }
  3. 使用mc命令编译修改后的UserController.java

    $ mc /tmp/UserController.java -d /tmp
    Memory compiler output:
    /tmp/com/example/demo/arthas/user/UserController.class
    Affect(row-cnt:1) cost in 346 ms
  4. 使用redefine命令,因为可以热更新代码

    $ redefine /tmp/com/example/demo/arthas/user/UserController.class
    redefine success, size: 1
    

丝滑的自动补全

在新版本里,改进了很多命令的自动补全,比如 watch/trace/tt/monitor/stack等。

下面是watch命令的第一个Tab补全结果,用户可以很方便的一步步补全类名,函数名:

$ watch
com.   sun.   javax. ch.    io.    demo.  jdk.   org.   java.

另外,新增加了 jad/sc/sm/redefine 等命令的自动补全支持,多按Tab有惊喜。

新版本的Web console

新版本的Web Console切换到了xtermd.js,更好地支持现代浏览器。

  • 支持Ctrl + C复制
  • 支持全屏

web console

Docker镜像支持

Arthas支持Docker镜像了

  • 用户可以很方便地诊断Docker/k8s里的Java进程
  • 也可以很方便地把Arthas加到自己的基础镜像里

参考: https://alibaba.github.io/arthas/docker.html

重定向重新设计

之前的版本里,Arthas的重定向是会放到一个~/logs/arthas-cache/目录里,违反直觉。

在新版本里,重定向和Linux下面的一致,>/>>的行为也和Linux下一致。

并且,增加了 cat/pwd命令,可以配置使用。

总结

总之,3.1.0版本的Arthas带了非常多的新功能,改进了很多的用户体验,欢迎大家使用反馈。

  • Arthas在线教程可以学到很多技巧
  • jad/mc/redefine 一条龙非常强大
  • 丝滑的自动补全值得尝试
  • 新版本的Web Console有惊奇

Release Note: https://github.com/alibaba/arthas/releases/tag/3.1.0

原文链接:http://hengyunabc.github.io/arthas-3.1.0/

@hengyunabc hengyunabc changed the title Arthas 3.1.0版本发布:在线教程、内存编绎器和强大的自动补全 Arthas 3.1.0版本发布:在线教程、内存编译器和强大的自动补全 Feb 14, 2019
@oldmanpushcart
Copy link

祝福ARTHAS,也祝我以后的系统都不要用到。哈哈哈哈

@hengyunabc hengyunabc added this to the 3.1.0 milestone Feb 14, 2019
@pinkdawn
Copy link

确实强大,帮助解决了不少问题

@limng06
Copy link

limng06 commented Feb 15, 2019

docker多pod情况下怎么 有批量热更新的方法吗 另外负载的原因,针对每个pod单独做热更新貌似不怎么方便啊

@hengyunabc
Copy link
Collaborator Author

docker多pod情况下怎么 有批量热更新的方法吗 另外负载的原因,针对每个pod单独做热更新貌似不怎么方便啊

Arthas目前定位是单机诊断,多机风险比较大,也很难实现,需要和很多外部系统对接。

@darkduckgo
Copy link

@hengyunabc 进阶教程里的500异常代码默认已经改没了, 而且主要问题是, 直接执行mc /tmp/UserController.java -d /tmp
会编译报错找不到环境, 在web控制台也会这样.... 而且文档里关于mc命令说的也挺少

@hengyunabc
Copy link
Collaborator Author

@hengyunabc 进阶教程里的500异常代码默认已经改没了, 而且主要问题是, 直接执行mc /tmp/UserController.java -d /tmp
会编译报错找不到环境, 在web控制台也会这样.... 而且文档里关于mc命令说的也挺少

时间比较赶,进阶教程还在改,目前的确有很多问题。mc 需要指定classloader。

sc -d com.example.demo.arthas.user.UserController | grep classLoaderHash

mc -c 6b884d57 /tmp/UserController.java -d /tmp

大概是这样。

@liufudev
Copy link

$ jad com.yy.*.*.*.query.CouponActQueryService Affect(row-cnt:0) cost in 14 ms.
请问一下这个是什么原因呢,jad在同一个会话中使用,为什么有的类可以反编译出来,有的不行,我暂时发现controller可以,service有些不行,我用sc -d查看到他们都是同一个类加载器加载到,用-c 指定类加载器也是这样到结果,没有报错也没有结果,求解答

@hengyunabc
Copy link
Collaborator Author

$ jad com.yy.*.*.*.query.CouponActQueryService Affect(row-cnt:0) cost in 14 ms.
请问一下这个是什么原因呢,jad在同一个会话中使用,为什么有的类可以反编译出来,有的不行,我暂时发现controller可以,service有些不行,我用sc -d查看到他们都是同一个类加载器加载到,用-c 指定类加载器也是这样到结果,没有报错也没有结果,求解答

试下 用精确的类名。 j

@liufudev
Copy link

liufudev commented Feb 17, 2019

$ jad com.yy.*.*.*.query.CouponActQueryService Affect(row-cnt:0) cost in 14 ms.
请问一下这个是什么原因呢,jad在同一个会话中使用,为什么有的类可以反编译出来,有的不行,我暂时发现controller可以,service有些不行,我用sc -d查看到他们都是同一个类加载器加载到,用-c 指定类加载器也是这样到结果,没有报错也没有结果,求解答

试下 用精确的类名。 j

我写肯定用的是jad 类的全名,没有模糊匹配。只是提问的时候隐藏了,求解答一下,不知道是我用法问题,还是属于一个bug

@hengyunabc
Copy link
Collaborator Author

$ jad com.yy.*.*.*.query.CouponActQueryService Affect(row-cnt:0) cost in 14 ms.
请问一下这个是什么原因呢,jad在同一个会话中使用,为什么有的类可以反编译出来,有的不行,我暂时发现controller可以,service有些不行,我用sc -d查看到他们都是同一个类加载器加载到,用-c 指定类加载器也是这样到结果,没有报错也没有结果,求解答

试下 用精确的类名。 j

我写肯定用的是jad 类的全名,没有模糊匹配。只是提问的时候隐藏了,求解答一下,不知道是我用法问题,还是属于一个bug

最好有可重现的demo,或者你自己debug下,参考: #222

@black-mandala
Copy link

请问下
执行 mc -c 74e4954f /root/tp-space/LoginController.java -d /root/tp-space/
报错,应该怎么解决呢
java.lang.IllegalStateException: Can not load JavaCompiler from javax.tools.ToolProvider#getSystemJavaCompiler(), please confirm the application running in JDK not JRE.

@hengyunabc
Copy link
Collaborator Author

请问下
执行 mc -c 74e4954f /root/tp-space/LoginController.java -d /root/tp-space/
报错,应该怎么解决呢
java.lang.IllegalStateException: Can not load JavaCompiler from javax.tools.ToolProvider#getSystemJavaCompiler(), please confirm the application running in JDK not JRE.

安装完整的jdk ,或者检查应用进程是否jdk下面的 java启动的。

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

No branches or pull requests

7 participants