Arthas 3.4.6 版本发布,全新版本的热更新功能

栏目: 软件资讯 · 发布时间: 3年前

内容简介:Arthas是 Alibaba 开源的 Java 诊断工具,深受开发者喜爱。 内部Gitlab: http://gitlab.alibaba-inc.com/middleware-container/arthas 内部在线诊断:http://start.alibaba-inc.com/arthas/web-console Github: ...

Arthas 3.4.6 版本发布,全新版本的热更新功能

Arthas是 Alibaba 开源的 Java 诊断工具,深受开发者喜爱。

Arthas 3.4.6 版本带来下面全新的特性:

  • 增加 retransform 命令,可以实现更完善的热更新代码功能
  • watch 打印调用发生的具体位置,即函数入口/退出/异常退出,可以直观定位
  • watch/trace等命令支持 --exclude-class-pattern 选项,可以排除掉指定的类
  • 大幅改进HTTP API的稳定性

retransform 命令工作原理

在之前,Arthas里通过 redefine 命令可以实现热更新功能。但是 redefine命令有缺陷:

  • redefine命令和jad/watch/trace/monitor/tt等命令会冲突。执行完redefine之后,如果再执行上面提到的命令,则会把redefine的字节码重置。
  • 原因是JDK本身redefine和retransform是不同的机制,同时使用两种机制来更新字节码,只有最后修改的会生效。

那么新增加的 retransform 命令和 watch/trace命令等是同一机制下实现的。如果对同一个类执行多个命令,则会经过下面的处理:

retransform 命令 -> watch 命令 -> trace命令

所以,我们可以看到,retransform 命令执行后,不会影响watch/trace命令。

retransform 使用参考

加载外部的.class文件,retransform jvm已加载的类。

retransform /tmp/Test.class
retransform -l
retransform -d 1                    # delete retransform entry
retransform --deleteAll             # delete all retransform entries
retransform --classPattern demo.*   # triger retransform classes
retransform -c 327a647b /tmp/Test.class /tmp/Test\$Inner.class
retransform --classLoaderClass 'sun.misc.Launcher$AppClassLoader' /tmp/Test.class

retransform 结合 jad/mc 命令使用

jad --source-only com.example.demo.arthas.user.UserController > /tmp/UserController.java

mc /tmp/UserController.java -d /tmp

retransform /tmp/com/example/demo/arthas/user/UserController.class
  • jad命令反编译,然后可以用其它编译器,比如vim来修改源码
  • mc命令来内存编译修改过的代码
  • 用retransform命令加载新的字节码

mc-retransform在线教程: https://arthas.aliyun.com/doc/arthas-tutorials?language=cn&id=command-mc-retransform

watch 打印调用发生的具体位置

可以看到输出结果里多了location=AtExceptionExitlocation=AtExit这样子的信息。

$ watch demo.MathGame primeFactors
Press Q or Ctrl+C to abort.
Affect(class count: 1 , method count: 1) cost in 58 ms, listenerId: 1
method=demo.MathGame.primeFactors location=AtExceptionExit
ts=2021-01-15 11:34:30; [cost=0.929596ms] result=@ArrayList[
    @Object[][isEmpty=false;size=1],
    @MathGame[demo.MathGame@439f5b3d],
    null,
]
method=demo.MathGame.primeFactors location=AtExit
ts=2021-01-15 11:34:31; [cost=0.153708ms] result=@ArrayList[
    @Object[][isEmpty=false;size=1],
    @MathGame[demo.MathGame@439f5b3d],
    @ArrayList[isEmpty=false;size=2],
]

watch/trace等命令支持 --exclude-class-pattern 选项

当watch一个接口时,会匹配到它的所有实现子类,但有的时候我们排除掉一些特定的类,则比较困难,需要写很复杂的正则表达式。

所以增加了一个 --exclude-class-pattern参数,可以很方便地排除掉不需要增强的类。

watch javax.servlet.Filter * --exclude-class-pattern com.demo.TestFilter

大幅改进HTTP API的稳定性

主要改进了HTTP API里json的处理,避免各种json格式化出现的问题。

总结


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Hacking

Hacking

Jon Erickson / No Starch Press / 2008-2-4 / USD 49.95

While other books merely show how to run existing exploits, Hacking: The Art of Exploitation broke ground as the first book to explain how hacking and software exploits work and how readers could deve......一起来看看 《Hacking》 这本书的介绍吧!

SHA 加密
SHA 加密

SHA 加密工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具