作者 | Halimao Java、go 爱好者(https://github.com/halimao/)

【Arthas 官方社区正在举行征文活动,参加即有奖品拿哦~点击投稿】

生产环境的 bug 开发环境无法复现怎么办?关键位置没有打印日志信息不足怎么办?莫慌,骚年。让强大的 Arthas法师来 carry,带你去生产环境"遨游"闯关。

刚接触 Arthas,就被它能够 watch 方法的输入参数和返回值的功能震惊到了。这简直太酷炫了,让你可以像本地单步调试一样,跟踪到每一步的执行结果和获取当前的变量数值。以前要定位线上问题,信息不足就需要加日志打印,定位问题,可能需要反复重启应用。用了 Arthas,根本不需要加日志打印,重启应用这些操作。花了大概一个周末下午,在本地跑了下官方 demo,熟悉了下常用操作。脑子里对 Arthas 能够做什么,能解决什么,怎么解决,已经有了大概的了解。后面需要用的时候,就能派上大用场了(学了就一定有 bug 会找上门的=.=)。

下面介绍一个特意找上门的 bug。

背景:同一个聊天交友类产品,对外以一个主品牌以及多个新品牌进行发布。服务端是共用一套数据的,但是所有对外展示的信息,涉及到品牌相关的,需要进行文案替换。在同一个群组里,主品牌和新品牌的用户可以互相聊天。

问题现象:

  • 线上某个群组里面,同一条聊天消息涉及到需要替换文案的内容时,主品牌侧的用户有的显示正常,有的显示为新品牌文案;
  • 不同的群聊天消息,同一个用户有的展示正常,有的异常;
  • 新品牌侧的用户看到的群聊天消息文案替换正常。

先贴下相关的代码(用 Arthas 的 jad 直接反编译的源码):

群聊消息下发方法:

write 方法文案替换逻辑代码:

PublishMessage 是下行消息类,replaceMsgMap 是提前生成好的各个新品牌对应文案,主品牌使用原始消息文案。

乍一看,文案替换逻辑没啥毛病(但问题就在这,大家可以先思考下),感觉自己又要去面对一个扑朔迷离的玄学 bug 了(永远不要把程序 bug 归结为灵异事件)。代码看不出问题,本地单步调试鼓捣了一早上,也没复现出来,看来只能在生产环境定位了,Arthas 要登场了。

由于生产环境的消息转发量很大,直接 attach 进程风险太高,且不利于单条消息观察定位。所以选择预发布环境进行 attach,请求量可控,数据和线上一致,也只有读操作,不会影响到生产环境。

用 Arthas 的 watch 命令,观察 write 方法的输入参数。

  • -x 表示遍历深度,可以调整来打印具体的参数和结果内容,默认值是 1
  • -b 表示观察方法调用前

可以看到,publishMessage、userSession 参数的值都显示出来了。接着就可以在预发布触发消息下行进行数据观察了。

建了个测试群,除了自己一个主品牌的测试用户还有另外一个新品牌用户。最初开始发送了几条群聊消息都正常,后面又拉了一个新品牌用户以及主品牌测试用户,复现的概率就高了许多。观察了下同一条群聊消息发给每个群成员的 publishMessage 值,发现如果先遍历到了新品牌用户,再遍历到主品牌用户时,publishMessage 的文案居然是新品牌文案!!!心里猛的一惊,是了,就是这个低级错误造成的 bug,大家应该也猜到原因了。

下面揭晓下这个问题产生的原因:

  • 遍历群成员传递的 publishMessage 形参,每次改变 payload 都会影响到被传递进去的 publishMessage 实参
  • replaceMsgMap 里只存储了新品牌文案
  • 主品牌根据 appName 获取对应文案时为空,则不设置 payload,使用最传递进来的 publishMessage 的 payload
  • 遍历群组成员时,顺序是随机性的

如果某个主品牌用户在新品牌用户之后被遍历到,那么 publishMessage 的 payload 字段就会被设置为新品牌文案。而主品牌在 replaceMsgMap 里找不到对应文案,就不更新 payload了,复用了上一次被遍历用户的 payload,就会出现文案显示异常。

知道原因后就好处理了,replaceMsgMap 里把主品牌的文案也加进去,每次遍历到主品牌,也更新 payload 字段,保证文案正常显示。

整个定位过程,无需增加 log 日志,线上应用也无需重启,便能获取足够的信息进行问题排查定位,是不是贼好用了。花个半天时间,摸索鼓捣下,要用时就能省下不少工夫。详细使用文档见->官方文档

一键安装并启动 Arthas

  • 方式一:通过 Cloud Toolkit 实现 Arthas 一键远程诊断

Cloud Toolkit 是阿里云发布的免费本地 IDE 插件,帮助开发者更高效地开发、测试、诊断并部署应用。通过插件,可以将本地应用一键部署到任意服务器,甚至云端(ECS、EDAS、ACK、ACR 和 小程序云等);并且还内置了 Arthas 诊断、Dubbo工具、Terminal 终端、文件上传、函数计算 和 MySQL 执行器等工具。不仅仅有 IntelliJ IDEA 主流版本,还有 Eclipse、Pycharm、Maven 等其他版本。

推荐使用 IDEA 插件下载 Cloud Toolkit 来使用 Arthas:http://t.tb.cn/2A5CbHWveOXzI7sFakaCw8

  • 方式二:直接下载

地址:https://github.com/alibaba/arthas。

Arthas 征文活动火热进行中

Arthas 官方正在举行征文活动,如果你有:

  • 使用 Arthas 排查过的问题
  • 对 Arthas 进行源码解读
  • 对 Arthas 提出建议
  • 不限,其它与 Arthas 有关的内容

欢迎参加征文活动,还有奖品拿哦~点击投稿

“阿里巴巴云原生关注微服务、Serverless、容器、Service Mesh 等技术领域、聚焦云原生流行技术趋势、云原生大规模的落地实践,做最懂云原生开发者的公众号。”

用 Arthas “庖丁解牛”相关推荐

  1. 使用arthas采集火焰图

    火焰图是用图形化的方式来展现profiler工具采集的性能数据,对数据进行统计和分析,方便找出性能热点. 现在我们使用arthas采集JVM的火焰图. 1.首先你需要安装arthas 说是安装其实就是 ...

  2. AI领域真正最最最最最稀缺的人才是……会庖丁解牛的那个人

    图片来源:Wired [AI科技大本营导读]这里,就不卖关子了.AI领域最最最最最稀缺的人才应该为人工智能架构师.有过4次技术创业经历,如今做AI投资的星瀚资本创始合伙人杨歌如是说. 在杨歌的身上,传 ...

  3. JMH 和 Arthas 定位问题的案例分享 !

    欢迎关注方志朋的博客,回复"666"获面试宝典 https://bryantchang.github.io/2019/12/08/java-profile-tools/ 最近的工作 ...

  4. JMH和Arthas定位问题的案例分享

    欢迎关注方志朋的博客,回复"666"获面试宝典 https://bryantchang.github.io/2019/12/08/java-profile-tools/ 最近的工作 ...

  5. 如何使用 Arthas 定位 Spring Boot 接口超时 ?

    以下文章来源方志朋的博客,回复"666"获面试宝典 来源:segmentfault.com/a/1190000020383866 背景 公司有个渠道系统,专门对接三方渠道使用,没有 ...

  6. 早就听闻阿里开源的 Arthas 在做 Java 应用诊断上十分牛逼,没失望

    点击上方蓝色"方志朋",选择"设为星标"回复"666"获取独家整理的学习资料! 来源 | https://jitwxs.cn/a64edcb ...

  7. SpringBoot接口频繁超时,长时间找不到原因,我用 Arthas 定位到了

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 公司有个渠道系统,专门对接三方渠道使用,没有什么业务逻辑, ...

  8. 阿里问题定位神器 Arthas 的骚操作,定位线上BUG,超给力

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者 | likai 来源 | https://urlify.cn ...

  9. Arthas 实践——生产环境排查 CPU 飚高问题

    生产环境 CPU 告警: 13:40 收到我们的生产环境服务器绿版 CUP 超负载告警通知. 此时心里只有一个想法,重启大法好,马上登录服务器,执行 top 发现进程 30247 和 28337 占用 ...

最新文章

  1. Android实现炫酷SVG动画效果
  2. 基于 HTML5 的 WebGL 自定义 3D 摄像头监控模型
  3. matlab输入数组换行,三维数组换行输入到文件(intel fortran 编译器) - 程序语言 - 小木虫 - 学术 科研 互动社区...
  4. [ZZ]职场白领必读:《如何成为PPT高手》(秋叶出品,完整版免费下载)
  5. python多继承顺序_Python多继承以及MRO顺序的使用
  6. Log4J入门教程(二) 参数讲解
  7. 超低内阻mos管_FHU100N03低压MOS管保障榨汁机电路正常运行!
  8. 【Python】ConvergenceWarning: Maximum number of iterations 200 reached. Increase it to improve...
  9. myeclipse 下搭建测试环境
  10. 人究竟能抠到什么程度?
  11. 利用js脚本自动批量删除微博内容
  12. 量化交易零基础入门教程
  13. mysql运算符xor_MySql运算符
  14. 树链剖分 - 月下“毛景树”(BZOJ 4151)
  15. 巧妙利用DZ自有功能实现豆丁网在线文档功能
  16. 转“软件测试职业发展方向”
  17. 《异常检测——从经典算法到深度学习》15 通过无监督和主动学习进行实用的白盒异常检测
  18. Office 2007兼容工具包
  19. 100个常见的php面试题和答案分享,精选php面试题及答案
  20. 珍大户 认知世界的经济学课程推荐电影《大空头》链接地址及笔记

热门文章

  1. Windows保护模式学习笔记(一)—— 段寄存器GDT表
  2. 邻接矩阵和邻接表的相互转化
  3. 100. 增减序列【差分 / 思维】
  4. 寒假每日一题2022【week1 完结】
  5. 什么是事务?为什么需要事务?
  6. jQuery的Prettydate插件
  7. python九九乘法表代码知乎_二年级上册表内乘法教学反思_二年级6的乘法口诀教学反思...
  8. 蓝桥杯-K好数(java)
  9. Tomcat配置问题解决方法
  10. python discuz_python实现的登陆Discuz!论坛通用代码分享