Arthrs学习

本文详细介绍了Arthrs的功能,包括基本使用如Attach、dashboard、thread1和类查找,以及进阶功能如Ognl命令(执行静态函数、查找类加载器、获取静态字段等)、监测异常信息、系统属性查看、环境变量管理、JVM信息获取、类搜索和反编译,提供了一种强大的Java应用动态监控和问题定位手段。
摘要由CSDN通过智能技术生成

Arthrs

Arthrs 能做什么

  1. 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
  2. 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
  3. 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
  4. 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
  5. 是否有一个全局视角来查看系统的运行状况?
  6. 有什么办法可以监控到JVM的实时运行状态?
  7. 怎么快速定位应用的热点,生成火焰图?
  8. 怎样直接从JVM内查找某个类的实例?

一、基本使用

  1. 启动 Java 程序后运行 arthas-boot.jar 。
  2. 选择进程号进行 Attach,Attach 成功后会打印 arthrs 的 logo 。
  3. dashboard 命令可以查看当前系统的实时数据面板,q 退出。
  4. thread 1 命令打印线程 ID 为 1 的栈。
  5. sc -d *MathGame 可以通过 sc 命令来查找JVM里已加载的类。
  6. 可以通过 jad 命令来反编译代码:jad demo.MathGame(类限定名)
  7. 通过watch命令可以查看函数的参数/返回值/异常信息:watch demo.MathGame primeFactors returnObj(q退出)
  8. 通过vmtool命令,可以搜索内存对象:vmtool --action getInstances --className java.lang.String --limit 10

二、进阶使用

  1. 前四步同上

  2. sysprop 可以打印所有的System Properties信息。(含有类如 java 版本,jvm 版本,用户时区,用户 home目录等)

    1. 指定单个key: sysprop java.version
    2. 通过grep来过滤: sysprop | grep user
    3. 设置新的value: sysprop testKey testValue
  3. sysenv 命令可以获取到环境变量。和sysprop命令类似。

  4. jvm 命令会打印出JVM的各种详细信息。

  5. 每一个命令都有详细的帮助信息。可以用-h来查看。比如:sysprop -h

  6. sc 命令可以查找到所有JVM已经加载到的类。

    1. 如果搜索的是接口,还会搜索所有的实现类。比如查看所有的Filter实现类:sc javax.servlet.Filter
    2. 通过-d参数,可以打印出类加载的具体信息,很方便查找类加载问题。sc -d javax.servlet.Filter(非常详细)
    3. sc支持通配,比如搜索所有的StringUtils:sc *StringUtils
  7. sm命令则是查找类的具体函数。

    1. 直接使用 sm java.math.RoundingMode
    2. 通过-d参数可以打印函数的具体属性:sm -d java.math.RoundingMode
    3. 也可以查找特定的函数,比如查找构造函数:sm java.math.RoundingMode
  8. 可以通过 jad 命令来反编译代码:jad com.example.demo.arthas.user.UserController

Ognl 命令
1. 调用static函数
ognl '@java.lang.System@out.println("hello ognl")'
2. 查找UserController的ClassLoader
sc -d com.example.demo.arthas.user.UserController | grep classLoaderHash
3. 获取静态类的静态字段

获取UserController类里的logger字段:

ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader @com.example.demo.arthas.user.UserController@logger

还可以通过-x参数控制返回值的展开层数。比如:

ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader -x 2 @com.example.demo.arthas.user.UserController@logger
4. 执行多行表达式,赋值给临时变量,返回一个List
ognl '#value1=@System@getProperty("java.home"), #value2=@System@getProperty("java.runtime.name"), {#value1, #value2}'
监测异常信息
1. 查看UserController的 参数/异常

在Arthas里执行:

watch com.example.demo.arthas.user.UserController * '{params, throwExp}'
  1. 第一个参数是类名,支持通配
  2. 第二个参数是函数名,支持通配

如果想把获取到的结果展开,可以用-x参数:

watch com.example.demo.arthas.user.UserController * '{params, throwExp}' -x 2
2. 当异常时捕获

watch命令支持-e选项,表示只捕获抛出异常时的请求:

watch com.example.demo.arthas.user.UserController * "{params[0],throwExp}" -e
3. 按照耗时进行过滤

watch命令支持按请求耗时进行过滤,比如:

watch com.example.demo.arthas.user.UserController * '{params, returnObj}' '#cost>200'

参考文档

Arthrs

Arthrs 能做什么

  1. 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
  2. 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
  3. 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
  4. 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
  5. 是否有一个全局视角来查看系统的运行状况?
  6. 有什么办法可以监控到JVM的实时运行状态?
  7. 怎么快速定位应用的热点,生成火焰图?
  8. 怎样直接从JVM内查找某个类的实例?

一、基本使用

  1. 启动 Java 程序后运行 arthas-boot.jar 。
  2. 选择进程号进行 Attach,Attach 成功后会打印 arthrs 的 logo 。
  3. dashboard 命令可以查看当前系统的实时数据面板,q 退出。
  4. thread 1 命令打印线程 ID 为 1 的栈。
  5. sc -d *MathGame 可以通过 sc 命令来查找JVM里已加载的类。
  6. 可以通过 jad 命令来反编译代码:jad demo.MathGame(类限定名)
  7. 通过watch命令可以查看函数的参数/返回值/异常信息:watch demo.MathGame primeFactors returnObj(q退出)
  8. 通过vmtool命令,可以搜索内存对象:vmtool --action getInstances --className java.lang.String --limit 10

二、进阶使用

  1. 前四步同上

  2. sysprop 可以打印所有的System Properties信息。(含有类如 java 版本,jvm 版本,用户时区,用户 home目录等)

    1. 指定单个key: sysprop java.version
    2. 通过grep来过滤: sysprop | grep user
    3. 设置新的value: sysprop testKey testValue
  3. sysenv 命令可以获取到环境变量。和sysprop命令类似。

  4. jvm 命令会打印出JVM的各种详细信息。

  5. 每一个命令都有详细的帮助信息。可以用-h来查看。比如:sysprop -h

  6. sc 命令可以查找到所有JVM已经加载到的类。

    1. 如果搜索的是接口,还会搜索所有的实现类。比如查看所有的Filter实现类:sc javax.servlet.Filter
    2. 通过-d参数,可以打印出类加载的具体信息,很方便查找类加载问题。sc -d javax.servlet.Filter(非常详细)
    3. sc支持通配,比如搜索所有的StringUtils:sc *StringUtils
  7. sm命令则是查找类的具体函数。

    1. 直接使用 sm java.math.RoundingMode
    2. 通过-d参数可以打印函数的具体属性:sm -d java.math.RoundingMode
    3. 也可以查找特定的函数,比如查找构造函数:sm java.math.RoundingMode
  8. 可以通过 jad 命令来反编译代码:jad com.example.demo.arthas.user.UserController

Ognl 命令
1. 调用static函数
ognl '@java.lang.System@out.println("hello ognl")'
2. 查找UserController的ClassLoader
sc -d com.example.demo.arthas.user.UserController | grep classLoaderHash
3. 获取静态类的静态字段

获取UserController类里的logger字段:

ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader @com.example.demo.arthas.user.UserController@logger

还可以通过-x参数控制返回值的展开层数。比如:

ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader -x 2 @com.example.demo.arthas.user.UserController@logger
4. 执行多行表达式,赋值给临时变量,返回一个List
ognl '#value1=@System@getProperty("java.home"), #value2=@System@getProperty("java.runtime.name"), {#value1, #value2}'
监测异常信息
1. 查看UserController的 参数/异常

在Arthas里执行:

watch com.example.demo.arthas.user.UserController * '{params, throwExp}'
  1. 第一个参数是类名,支持通配
  2. 第二个参数是函数名,支持通配

如果想把获取到的结果展开,可以用-x参数:

watch com.example.demo.arthas.user.UserController * '{params, throwExp}' -x 2
2. 当异常时捕获

watch命令支持-e选项,表示只捕获抛出异常时的请求:

watch com.example.demo.arthas.user.UserController * "{params[0],throwExp}" -e
3. 按照耗时进行过滤

watch命令支持按请求耗时进行过滤,比如:

watch com.example.demo.arthas.user.UserController * '{params, returnObj}' '#cost>200'

参考文档

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值