0
点赞
收藏
分享

微信扫一扫

Arthas学习&实战使用&使用场景和问题

践行数据分析 2022-01-27 阅读 99

基础命令

rest:将增强过的类进行还原,后面可以带参数来进行过滤操作,服务器关闭时候会自动重置

trace:追踪某个包下面的某个类

history:历史命令

quti:退出

keymap: 展示快捷键

jvm相关命令

dashboard 仪表板

dashboard 仪表板

thread 线程相关

jvm 相关信息

sysprop

sysenv 系统环境

getstatic

getstatic 类名 属性名 获取

ognl命令

class/classloader相关命令

sc:

search class

image-20220126100807235

sm:

search method

💡jad:

  #先反编译出java代码,后面的queryPatinfo是方法名,如果不写的话就是编译整个类,否则就是只有当前方法;如果前面没有–source-only,则不会显示类路径和类加载器,,,文件默认保存在opt下面
  jad --source-only  cn.swifthealth.sync.api.inpat.service.InMainAndOrderServiceImpl  >  queryPatinfo      
  #再对代码进行编辑
  vi queryPatinfo      
  #查找类加载器
  sc -d cn.swifthealth.sync.api.dbmonitor.service.DbStatusServiceImpl | grep classLoaderHash
  #编译为class文件,-d后面是保存的路径
  mc -c 49c2faae /opt/queryPatinfo -d /opt
  #热更新
  redefine queryPatinfo.cal
  #说明:当新增/删除field/method时,redefine会有失败的可能性,如果当前执行的方法一直在运行也会导致无法生效

💡 watch命令

# watch命令:

# 查看某个方法的入参和返回值:
watch cn.swifthealth.sync.api.inpat.service.InMainAndOrderServiceImpl queryPatinfo {params,returnObj} -x 4
  
#  示例: watch  类路径   方法名   {参数和返回值}  遍历深度
#  说明: 如果只需要展示参数或者返回值,则直接写出来,不用大括号括起来,如果需要返回多个信息则需要括起来,-x 和后面的数字,表示遍历的深度,如果深度不够则返回的是一个model,控制台只能看到类的路径,只有达到深度才能返回具体的返回值,下面分支列出深度为2和4时候的返回值

2022-01-26_16-46

参数名称参数说明
class-pattern类名表达式匹配
method-pattern函数名表达式匹配
express观察表达式,默认值:{params, target, returnObj}
condition-express条件表达式
[b]函数调用之前观察
[e]函数异常之后观察
[s]函数返回之后观察
[f]函数结束之后(正常返回和异常返回)观察
[E]开启正则表达式匹配,默认为通配符匹配
[x:]指定输出结果的属性遍历深度,默认为 1

深度为2
深度为4

???

watch cn.swifthealth.sync.api.inpat.service.InMainAndOrderServiceImpl queryPatinfo {params,returnObj} 'params[1]="abc"'   -x 3

通过在需要返回的内容后面加 ’’ ,里面写上过滤的条件来实现只展示指定的内容,,,,这块有个问题就是如何根据入参某个字段是某个值来进行过滤
要过滤的结果用target表示,然后具体字段用target.属性名表示。
--查入参
watch cn.swifthealth.sync.api.inpat.service.InMainAndOrderServiceImpl queryPatinfo params -x 2 -b
--按照耗时进行过滤
watch cn.swifthealth.sync.api.inpat.service.InMainAndOrderServiceImpl queryPatinfo '{params,returnObj}' '#cost>10' -x 

dump

 #dump 类路径,将编译后的类保存到一个以类加载器为名字的文件夹中,可以进行访问
 dump cn.swifthealth.sync.api.inpat.service.InMainAndOrderServiceImpl 
 

montor

#监视某个类下的某个方法在指定时间段内的调用情况,  -c 表示cycle,即间隔多久当做一个周期,如果不写默认是120s,-c 3表示3s一个监视周期
monitor cn.swifthealth.sync.api.inpat.service.InMainAndOrderServiceImpl queryPatinfo -c 3

montor

💡trace

#[n: ]  设置命令执行次数; -n 5 表示监视5次方法的调用,不写的话就是调用几次方法,追踪几次    (可以不写)
trace  cn.swifthealth.sync.api.inpat.service.InMainAndOrderServiceImpl queryPatinfo -n 5
#cost   方法执行耗时,单位是毫秒      ‘#cost > 100’  表示只对耗时超过100ms的执行进行监视  (可以不写)
trace  cn.swifthealth.sync.api.inpat.service.InMainAndOrderServiceImpl queryPatinfo '#cost > 100'

stack

#[E] 正则表达式匹配
和trace类似
#[n: ] 调用次数
和trace类似

tt

tt的参数说明
-t记录一个方法在一个时间段中的调用
-l显示所有已经记录的列表
-n只记录次数
-s搜索表达式
-i查看指定索引号的详细调用信息

tt

tt -t  cn.swifthealth.sync.api.inpat.service.InMainAndOrderServiceImpl queryPatinfo 

火焰图

# 启动报错
[arthas@1]$ profiler start
Perf events unavailable. See stderr of the target process.
perf_event_open() syscall has failed. The error message is printed to the error stream of the target JVM.
# 问题原因
Typical reasons include:
/proc/sys/kernel/perf_event_paranoid is set to restricted mode (>=2).
/proc/sys/kernel/perf_event_paranoid 设置为受限模式(> = 2)
# 问题解决
# 从Linux4.6开始,如果需要使用非root用户启动的进程中的perf_events,捕获内核调用堆栈的信息,需要设置两个系统运行时变量,可以使用sysctl或按如下方式设置它们:
echo 1 > /proc/sys/kernel/perf_event_paranoid
echo 0 > /proc/sys/kernel/kptr_restrict
  • profile start 启动火焰图
  • profile getSample 获取样本
  • profile list 样本列表
  • profile status 样本获取状态
举报

相关推荐

0 条评论