简介: 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. 关于全景(360)图片拼接的方法(Opencv3.0 Stitcher)

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...

  2. PAT 甲级1005【1005 Spell It Right】

    用JAVA可以用BigInteger解决. import java.io.BufferedReader; import java.io.IOException; import java.io.Inpu ...

  3. NJUPT自控第一次积分赛的小总结(一)题目感受

    快开学了事情真的好多啊 -_- 忙完积分赛就赶紧要去复习期末了...线代还是依托答辩啥都不懂 先看题目吧,RT,我们队(我)选择的是第一题(仅仅是因为很简单罢啦) 一开始看题目,心想不就调调pid吗, ...

  4. uni-app 应对微信小程序最新隐私协议接口要求的处理方法

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 一,问题起因 最新在开发小程序的时候,调用微信小程序来获取用户信息的时候经常报错一个问题 fail api scope is not de ...

  5. 重新启动mysql

    liu@liu-virtual-machine:~$ ps aux|grep mysqld mysql 5252 0.2 4.5 1496516 181200 ? Sl 11:01 0:01 /usr ...

  6. C# 剪裁图片

    /// <summary> /// 剪裁图片 /// </summary> /// <param name="src">原图片</para ...

  7. 06 PSP成熟度模型【软件过程与管理】

    PSP成熟度模型(Personal Software Process) 个体度量过程 PSP3 周期开发 个体计划过程 PSP2 代码评审 设计评审 PSP2.1 设计模板 个体质量管理过程 PSP1 ...

  8. Python---flask框架实现清除cookies功能

    路由部分: 1 #用户退出清理cookie 2 @app.route('/clean_cookies',methods=['GET', 'POST']) 3 def clean_cookies(): ...

  9. #K-D Tree#洛谷 2093 [国家集训队]JZPFAR

    题目 平面上有 \(n\) 个点.现在有 \(m\) 次询问,每次给定一个点 \((px, py)\) 和一个整数 \(k\), 输出 \(n\) 个点中离 \((px, py)\) 的距离第 \(k ...

  10. ABA问题的本质及其解决办法

    目录 简介 第一类问题 第二类问题 第一类问题的解决 第二类问题的解决 总结 简介 CAS的全称是compare and swap,它是java同步类的基础,java.util.concurrent中 ...