当前位置: 首页 > news >正文

【工作技术栈】【arthas】arthas使用方式总结(诊断问题+方法执行)

这里写目录标题

  • 前言
  • 原使用文档
  • 示例
    • 查看某个对象中的所有成员变量
      • 常见场景:
      • 命令如下
      • 原参考文档链接
    • 查看某个静态类型的值
      • 常见场景:
      • 命令如下
      • 原参考文档链接
    • 简单观察某个函数的入参和返回值
      • 常见场景:
      • 命令如下
      • 原参考文档链接
    • 查看函数执行的路径
      • 常见场景:
      • 命令如下
      • 原参考文档链接
    • 查看这个方法从哪调用过来的
      • 常见场景:
      • 命令如下
      • 原参考文档链接
    • 执行一下某个方法
      • 常见场景:
      • 命令如下
      • 原参考文档链接
  • 写在后头

前言

这篇文章主要为了写给刚刚接触到arthas的同学和我自己,刚开始我看到arthas的简介时觉得这个插件实在是太厉害了,我一定要把这个技能学到熟练!这样线上和线下问题就不用再和别人抢占debug端口了!(当然我认为arthas也是一种硬核的问题排查,通常我认为系统应该具有良好的日志打点,能够在不符合预期的地方将关键信息打印出来,这样既能够加快软件的问题定位,还能够统计问题的影响面,比如从哪个业务方来的流量大概有多少量级,从而可以做出合理的决策)

那么这篇文章主要将我自己在排查问题的时候需要用到arthas时,但又不知道众多命令应该使用哪一个的时候最终总结出来的方法论,大家可以参考一下,如果还有更好的快速方便的排查命令一定要评论区at我添加进来!感谢各路大神!

原使用文档

https://arthas.aliyun.com/doc/commands.html

示例

查看某个对象中的所有成员变量

常见场景:

1、出现堆栈异常并且,异常中确定到某一行时,该行存在连续调用(也就是不知道哪个调用出现的问题)
2、需要查看springbean的注入情况和注入类型是否符合预期

命令如下

该命令暂时在命令生成工具中没有找到,所以这边我直接从文档中扒拉出来一份固定的命令格式,大家自行复制替换

vmtool --action getInstances --className <你的className全ref> --limit 10 --express ‘instances[0]’

这里limit如果你的对象下成员变量超过10个,这里可以加大limit值,就能看到你的对象的成员变量了

原参考文档链接

https://arthas.aliyun.com/doc/vmtool.html#%E6%89%A7%E8%A1%8C%E8%A1%A8%E8%BE%BE%E5%BC%8F

查看某个静态类型的值

常见场景:

1、某些类中存在static,在类被第一次load的时候会被执行,之后可能会被某处改变,此时需要看值是什么

命令如下

arthas idea插件生成
在这里插入图片描述
命令格式:

getstatic top.swzhao.project.workflow.common.contants.EngineConstants STR_JDBC_URL1 -x 3

top.swzhao.project.workflow.common.contants.EngineConstants STR_JDBC_URL1 替换为你的变量名全路径

原参考文档链接

top.swzhao.project.workflow.common.contants.EngineConstants STR_JDBC_URL1

简单观察某个函数的入参和返回值

常见场景:

1、函数的行为不符合预期并且没有日志打点的情况
2、如果能够确认问题出在某个函数的时候,可以直接观察该函数的返回值即可

命令如下

arthas idea插件生成:
在这里插入图片描述
命令示例:

watch top.swzhao.project.workflow.core.engineimpl.OmpFlowEngineImpl start ‘{params,returnObj,throwExp}’ -n 5 -x 3

top.swzhao.project.workflow.core.engineimpl.OmpFlowEngineImpl替换为你自己的类
start 替换为你自己的方法名

原参考文档链接

https://arthas.aliyun.com/doc/watch.html

查看函数执行的路径

常见场景:

1、程序员:wc 不应该啊?怎么可能走到这里?
2、这地方为啥为true?不能啊?我在做梦吗?

命令如下

使用idea arthas trace:能够跟踪函数的执行路径和每一行的执行明细
在这里插入图片描述

命令示例:

trace top.swzhao.project.workflow.core.engineimpl.OmpFlowEngineImpl start -n 5 --skipJDKMethod false

自行替换类名和方法名:
【类名】top.swzhao.project.workflow.core.engineimpl.OmpFlowEngineImpl 【方法名】start

原参考文档链接

https://arthas.aliyun.com/doc/trace.html

查看这个方法从哪调用过来的

常见场景:

1、出现一些熟悉的log但是,打印log的函数调用方非常多,不知道从哪里来的

命令如下

使用idea arthas trace:能够跟踪函数的执行路径和每一行的执行明细
在这里插入图片描述
命令示例:

stack top.swzhao.project.workflow.core.engineimpl.OmpFlowEngineImpl start -n 5

自行替换类名和方法名:
【类名】top.swzhao.project.workflow.core.engineimpl.OmpFlowEngineImpl 【方法名】start

原参考文档链接

https://arthas.aliyun.com/doc/stack.html

执行一下某个方法

常见场景:

1、这个方法我想查看一下
2、我想调用一下这个方法(理由。。我喜欢这个方法不行吗?:)dddd)

命令如下

这个命令的生成有点麻烦,主要有步骤如下:
1、获取方法所在类的classloader的hash值
在这里插入图片描述
命令: sc -d <你的类全称>

执行后找到关键字并复制:
在这里插入图片描述

2、使用插件,将hash值放入,用插件生成执行命令
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

3、在插件命令中填充方法入参
在这里插入图片描述
这里解释一下:
因为我的方法入参如下:
在这里插入图片描述
所以我这边需要填入tplId和一个map,大家后面需要根据自己的特点来定制自己的入参哈

4、在command中执行调用即可

原参考文档链接

https://arthas.aliyun.com/doc/sc.html#%E5%8F%82%E6%95%B0%E8%AF%B4%E6%98%8E
https://arthas.aliyun.com/doc/vmtool.html

写在后头

如果有更好的示例,麻烦按照如上格式邮箱给我,我会帮你添加上去~
2260755767@qq.com


http://www.mrgr.cn/news/70313.html

相关文章:

  • 小面馆叫号取餐流程 佳易王面馆米线店点餐叫号管理系统操作教程
  • 2024 年Postman 如何安装汉化中文版?
  • 基于ZYNQ7035的PS-linux实现FTP服务器移植
  • Scala图书馆创建图书信息
  • MYSQL隔离性原理——MVCC
  • (一)- DRM架构
  • 沃德云商协:助力多组织无障碍沟通与合作的平台
  • 2024年精选SaaS招聘系统平台汇总
  • gcc 1.c和g++ 1.c编译阶段有什么区别?如何知道g++编译默认会定义_GNU_SOURCE?
  • 2024MoonBit全球编程创新挑战赛参赛作品“飞翔的小鸟”技术开发指南
  • 模糊搜索:在不确定性中寻找精确结果
  • PEF22554HTV3.1 品牌INTEL 电信 IC 调帧器,线路接口单元(LIU) P-TQFP-144-6 在售20000PCS
  • 云时代基础设施模型:可变与不可变之析
  • APO全量日志对接logstash和fluent日志采集生态
  • 人工智能、机器学习与深度学习:层层递进的技术解读
  • FPGA学习笔记#5 Vitis HLS For循环的优化(1)
  • 健身中心健身管理系统的设计与实现(源码+数据脚本+论文+技术文档)
  • 剧本杀app开发,行业发展的新方向
  • qt ui设计案例--登录界面
  • uniapp—android原生插件开发(1环境准备)
  • PostgreSQL 计算两个时间之间的日期差
  • 因为我不停地“抄”爆款选题,终于月入5万
  • 叉车倒车防撞预警系统:保障生产效率和员工安全
  • 2-UML概念模型测试
  • Elasticsearch实战应用:从入门到精通
  • C++网络编程之IO多路复用(三)