简介: 1. Arthas有什么功能,怎么用,请看:Arthas使用手册 2. Arthas命令比较复杂,一个帮助生成命令的IDEA插件:arthas idea plugin 使用文档 3. 基于Arthas实现的简单好用的热部署插件:ArthasHotSwap

作者 | 默达
来源 | 阿里技术公众号

  1. Arthas有什么功能,怎么用,请看:Arthas使用手册
  2. Arthas命令比较复杂,一个帮助生成命令的IDEA插件:arthas idea plugin 使用文档
  3. 基于Arthas实现的简单好用的热部署插件:ArthasHotSwap

一 引言

首先我们应该抛弃面向debug编程的思维,debug不一定是最高效的方法,遇到线上问题不能debug了怎么办。本文介绍如何使用Arthas代替debug提高日常开发效率。

开始之前,可以先浏览下上面推荐的这些文章,下面所使用到的东西在以上的文章都有详细的讲解。大家也可以先浏览下面的内容,确定所描述的确实可以提高开发效率,再去看上面的文章也是可以的。

首先我们要安装两个插件“arthas idea” 和 “ArthasHotSwap”,IDEA可以直接安装使用。“arthas idea”是为了高效率生成Arthas命令,“ArthasHotSwap”可以实现简单快捷的热部署。接下来我们通过几个场景来看如何使用Arthas提高日开发常效率。

二 5分钟解决一个问题

1 问题表象

问题的表象是预发接口返回参数为空,不知道为什么为空,关键地方又没有打日志。怎么办,debug?debug端口不好申请,而且一直占用环境引起公愤。加日志重新部署?部署时间太长,而且不一定查看日志就能发现问题。接下去我将使用Arthas排查问题。

2 如何发现问题

第一步:定位相关方法

首先定位到相关的代码,代码如下图所示,方法执行结果应该要返回一个map,也就是上面问题的extraData,返回为空,肯定是这里有问题,但不知道那行代码的问题。借助Arthas可以想到的是,我能观测这个方法的出参和入参,说不定能发现问题。于是使用Arthas的watch命令观测方法执行情况。

第二步:生成方法观测命令

安装了“arthas idea”插件之后,在方法名上面单击右键,选择watch,如下图所示。

第三步:登录应用服务器

一般应用都部署在云上或其他远程服务器,我们需要登录应用部署的服务器。

第四步:安装Arthas

Arthas 支持在 Linux/Unix/Mac 等平台上一键安装,请复制以下内容,并粘贴到命令行中,敲 回车 执行即可。

curl -L https://arthas.aliyun.com/install.sh | sh

第五步:运行Arthas

上述命令会下载启动脚本文件 as.sh 到当前目录,直接在shell下面执行./as.sh,就会进入交互界面。

第六步:执行观测方法命令

第二步执行完后,观测方法的命令已经在粘贴板了,粘贴执行就行,示例命令如下:

watch com.**.**.endpoint.BargainPlayApplyCycleEndPoint fetchPlayDetailRenderData '{params,returnObj,throwExp}' -n 5 -x 3 'params[0].getPlayToolDO().getId()==588'

命令解释:'{params,returnObj,throwExp}' 表示观测对象,这里选择了入参、出参和异常,-n 5 表示观测到5次后停止,-x 3 表示打印观测对象的时候只打印3层嵌套结构,'params[0].getPlayToolDO().getId()==588' 为条件表达式,满足该条件的才会被观测到。

第七步:查看观测结果

前端重新触发执行后,得到观测结果如下所示,从入参可以看到playActivityApplyRequest中的targetId为null,实际上应该要取playActivityRecordDO中的targetId。从返回结果可以看到确实是因为商品ID不存在原因。

3 更进一步解决问题

截止目前已经发现了问题所在,一般的同学都是修改代码重新部署,等上10多分钟。我们要做不一般的同学,接下去就轮到ArthasHotSwap热部署插件上场了。在IDEA的插件仓库搜索并安装ArthasHotSwap。

ArthasHotSwap 热部署

修改代码 -> maven编译 -> 单击右键选择swap this class -> 热部署命令已经复制到粘贴板 -> 登录远程服务器粘贴并执行热部署命令 -> 热部署成功

问题解决

热部署成功,问题解决,前端重新请求,前端展示正常。

虽然整个链路看上去很长,但是都是一些很简单的复制粘贴操作,这是我在联调过程中处理的实际问题,整个过程差不多就是5分钟左右,切身感受到Arthas的便利,忍不住分享一下。

4 一些限制

arthas redefine有一些限制导致热部署也有同样的限制。热部署时候,不能修改方法名、属性字段,只能修改方法体里面的代码。

redefine 命令和 jad/watch/trace/monitor/tt 等命令会冲突。执行完 redefine 之后,如果再执行上面提到的命令,则会把 redefine 的字节码重置。也就是说,热部署执行完成之后,再执行 jad/watch/trace/monitor/tt 等命令,会使热部署失效,所以在适当的时候还是需要重新部署下。我们也可以采用其他方法规避,比如使用watch的时候,观测其他类的方法,而不是热部署的那个类。

三 方法执行的时间隧道

上面的场景讲到了使用watch命令观测方法执行参数,但是watch是观测方法执行瞬间的情况。如果我们想重现上次的调用该怎么办呢。

在日常开发过程中,环境问题是非常影响开发效率的,特别是涉及其他团队的应用的时候,有时候希望上游再次触发一次调用都是很困难的一件事情。当你用上面的方法解决了你的问题之后,你想调试一下,发现已经夜深了,不好意思再让上游应用触发一次调用,该怎么办呢,自己根据watch观测的方法入参组装参数使用hsf控制台调用?我们要做不一般的同学,用工具解放生产力。

1 获取tt命令

Arthas的tt命令可以获取方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测。

安装好arthas idea插件之后,在需要记录执行的方法上面单击右键,选择TimeTunnel Tt,出现下面的选择框,第一个红框是获取记录方法执行的命令。第二个红框是记录方法执行之后需要对记录进行的操作,包括查看记录列表、查看记录执行情况、重现调用等。

2 记录方法执行

登录远程服务器,运行以下两条运行arthas,然后执行从idea插件复制的tt -t命令来记录方法执行,如下图所示。如果想停止记录可以输入q,查看记录使用tt -l。

curl -L https://arthas.aliyun.com/install.sh | sh
./as.sh

3 搜索方法执行记录

tt -l可以查看所有的方法执行记录,但是我们要和我们相关的执行记录,那么可以使用tt -s命令进行搜索。tt -s 命令后面需要携带过滤条件。条件表达式是使用OGNL编写,下面介绍几个通常的过滤表达式。首先介绍下几个对象,params表示入参,params[0]表示第一个参数,params[1]表示第二个参数,returnObj表示返回对象。

  • 根据入参过滤:tt -s 'params[2].getRecordId() == 110213603'
  • 根据返回结果过滤:tt -s 'returnObj.isSuccess() == false'
  • 根据入参和返回结果过滤:tt -s 'returnObj.isSuccess() == true && params[2].getRecordId() == 110213603'

4 查看方法执行情况

tt -w 相当于tt下面的watch命令,可以用来查看方法执行情况。使用idea插件获取tt -w 命令更方便。

5 重新触发

如果需要重新触发某条记录也是可行的,因为tt命令记录当时调用的情况,所以可以本地发起一次调用,tt -p -i 1000 命令的意思重新触发idex=1000的那条记录。不仅仅可以重新触发,还可以间隔时间内多次触发,tt -p --replay-times 5 --replay-interval 2000 -i 1000 表示重新触发5次,每次间隔2s。

重新触发的时候我们可能还想再watch下方法执行情况,怎么办呢,另外再打开一个页面登录远程服务器,运行arthas,执行 watch 命令。

6 一些限制

ThreadLocal 信息丢失

很多框架偷偷的将一些环境变量信息塞到了发起调用线程的 ThreadLocal 中,由于调用线程发生了变化,这些 ThreadLocal 线程信息无法通过 Arthas 保存,所以这些信息将会丢失。一些常见的 CASE 比如:鹰眼的 TraceId 等。

引用的对象

需要强调的是,tt 命令是将当前环境的对象引用保存起来,但仅仅也只能保存一个引用而已。如果方法内部对入参进行了变更,或者返回的对象经过了后续的处理,那么在 tt 查看的时候将无法看到当时最准确的值。这也是为什么 watch 命令存在的意义。

原文链接

本文为阿里云原创内容,未经允许不得转载。

如何使用Arthas提高日常开发效率?的更多相关文章

  1. 极大提高Web开发效率的8个工具和建议(含教程)

    面对复杂的 Web 应用的开发,良好的流程和工具支持是必不可少的,它们可以让日常的开发工作更加顺畅.更加高效.本文介绍了6个Web开发利器以及相关的教程,帮助你在开发.调试.集成和发布过程极大地提高效 ...

  2. iOS开发——实用篇&提高iOS开发效率的方法和工具

    提高iOS开发效率的方法和工具 介绍 这篇文章主要是介绍一下我在iOS开发中使用到的一些可以提升开发效率的方法和工具. IDE 首先要说的肯定是IDE了,说到IDE,Xcode不能跑,当然你也可能同时 ...

  3. 提高你开发效率的十五个Visual Studio 2010使用技巧

    提高你开发效率的十五个Visual Studio 2010使用技巧 相信做开发的没有不重视效率的.开发C#,VB的都知道,我们很依赖VS,或者说,我们很感谢VS.能够对一个IDE产生依赖,说明这个ID ...

  4. legend2---开发日志11(如何提高终极开发效率)

    legend2---开发日志11(如何提高终极开发效率) 一.总结 一句话总结: 实在没必要摸索着做,直接学了做,用专门的东西来做,岂不是要省时省事很多.岂不美哉. 1.vue中的滚动字幕动画效果如何 ...

  5. 提高 JavaScript 开发效率的高级 VSCode 扩展!

    原文:提高 JavaScript 开发效率的高级 VSCode 扩展! 作者:前端小智 Fundebug经授权转载,版权归原作者所有. Quokka.js Quokka.js 是一个用于 JavaSc ...

  6. 提高php开发效率的9大代码片段

    在网站开发中,我们都期望能高效快速的进行程序开发,如果有能直接使用的代码片段,提高开发效率,那将是极好的.php开发福利来了,今天小编就将为大家分享9大超实用的.可节省大量开发时间的php代码片段. ...

  7. itoo-快捷部署脚本--提高部署开发效率

     本次是第一次使用批处理文件来作为批量操作的工具,代替了人工的手动的复制,粘贴的方式,使用脚本实现了项目的启动.自动化部署,打开项目根目录.等等,提高了开发和调试的效率. 说明: 当前版本:1.0 ...

  8. <转>提高iOS开发效率的方法和工具

    介绍 这篇文章主要是介绍一下我在iOS开发中使用到的一些可以提升开发效率的方法和工具. IDE 首先要说的肯定是IDE了,说到IDE,Xcode不能跑,当然你也可能同时在使用AppCode等其他的ID ...

  9. 提高iOS开发效率的方法和工具

    http://www.cocoachina.com/ios/20150717/12626.html 介绍 这篇文章主要是介绍一下我在iOS开发中使用到的一些可以提升开发效率的方法和工具. IDE 首先 ...

  10. 【Java】能提高日常工作效率的一些Java函数

    自编工具总是临时抱佛脚来得顺溜,宜常备手边以提高工作效率: package com.hy; import java.io.File; /** * 日常工作常用的一些工具方法 * @author 逆火 ...

随机推荐

  1. JSF标签之f:facet 的使用方法

    f:facet标签用来为包含f:facet标签的父组件与被f:facet标签所包含的子组件之间申明一种特殊的关系.常与h:panelGrid,h:dataTable等标签连用,申明组件为标题或页脚. ...

  2. 如何在UE4中播放本地视频文件?

    在UE4中有一套媒体框架方法,它根据视频源的不同,对应的播放方式也不一样,支持的视频源有本地视频文件.影像序列.视频流.实时视频截图.播放形式可选择在场景内的静态网格上播放或者以UI的形式播放.本文主 ...

  3. 喜讯!瑞云科技被授予“海上扬帆”5G融合应用专委会成员单位

    2022年7月19日,5G应用"海上扬帆"行动计划云启航大会暨"海上扬帆"融合应用专委会成立大会在沪成功举办. 受上海信通院工创中心邀请和信任,深圳市瑞云科技有 ...

  4. 云化XR,如何助力产业升级

    XR(Extended Reality)是指借助计算机图形技术和可穿戴设备所生成的一个真实与虚拟组合的.可人机交互的环境.XR中的"X"只是一个变量,可以代表任何字母,包括VR(V ...

  5. 三维模型3DTile格式轻量化在数据存储的重要性分析

    三维模型3DTile格式轻量化在数据存储的重要性分析 三维模型3DTile格式轻量化在数据存储中占有重要地位.随着科技的不断发展,尤其是空间信息科技的进步,人们对于三维地理空间数据的需求日益增长.然而 ...

  6. MindSponge分子动力学模拟——自建力场(2024.03)

    技术背景 在MindSponge教程合集中我们已经介绍了很多使用MindSponge进行分子动力学模拟的方法,这里主要介绍在MindSponge中自定义一个力场.在传统的MD软件中,如果你希望去开发一 ...

  7. CDA数据分析师证书一级Level 1 专业备考资料

    CDA数据分析师一级Level 1 专业备考资料 包含视频课程+视频配套参考资料,新版大纲,可以边看边学边做笔记. 考试大纲+模拟题+报考指南 + 教材电子书PDF版 关注订阅号[靠谱杨阅读人生]回复 ...

  8. Jetty的http2模块

    启用http2模块,执行如下命令: java -jar $JETTY_HOME/start.jar --add-modules=http2 命令的输出,如下: INFO : http2 initial ...

  9. 深入理解 Java 修饰符与封装:访问权限、行为控制与数据隐藏

    Java 修饰符 Java 修饰符 用于控制类.属性.方法和构造函数的访问权限和行为.它们可以分为两组: 访问修饰符: public: 意味着代码对所有类可访问. private: 意味着代码只能在声 ...

  10. 持续构建行业影响力|HarmonyOS SDK荣膺年度“技术卓越”奖项

    自2023年9月华为宣布鸿蒙原生应用全面启动以来,HarmonyOS SDK通过将HarmonyOS系统级能力对外开放,支撑开发者高效打造更纯净.更智能.更精致.更易用的鸿蒙原生应用,和开发者共同成长 ...