Arthrs
Arthrs 能做什么
- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
- 是否有一个全局视角来查看系统的运行状况?
- 有什么办法可以监控到JVM的实时运行状态?
- 怎么快速定位应用的热点,生成火焰图?
- 怎样直接从JVM内查找某个类的实例?
一、基本使用
- 启动 Java 程序后运行 arthas-boot.jar 。
- 选择进程号进行 Attach,Attach 成功后会打印 arthrs 的 logo 。
- dashboard 命令可以查看当前系统的实时数据面板,q 退出。
- thread 1 命令打印线程 ID 为 1 的栈。
- sc -d *MathGame 可以通过
sc
命令来查找JVM里已加载的类。 - 可以通过
jad
命令来反编译代码:jad demo.MathGame(类限定名) - 通过
watch
命令可以查看函数的参数/返回值/异常信息:watch demo.MathGame primeFactors returnObj(q退出) - 通过
vmtool
命令,可以搜索内存对象:vmtool --action getInstances --className java.lang.String --limit 10
二、进阶使用
-
前四步同上
-
sysprop
可以打印所有的System Properties信息。(含有类如 java 版本,jvm 版本,用户时区,用户 home目录等)- 指定单个key:
sysprop java.version
- 通过
grep
来过滤:sysprop | grep user
- 设置新的value:
sysprop testKey testValue
- 指定单个key:
-
sysenv
命令可以获取到环境变量。和sysprop
命令类似。 -
jvm
命令会打印出JVM
的各种详细信息。 -
每一个命令都有详细的帮助信息。可以用
-h
来查看。比如:sysprop -h -
sc
命令可以查找到所有JVM已经加载到的类。- 如果搜索的是接口,还会搜索所有的实现类。比如查看所有的
Filter
实现类:sc javax.servlet.Filter - 通过
-d
参数,可以打印出类加载的具体信息,很方便查找类加载问题。sc -d javax.servlet.Filter(非常详细) sc
支持通配,比如搜索所有的StringUtils
:sc *StringUtils
- 如果搜索的是接口,还会搜索所有的实现类。比如查看所有的
-
sm
命令则是查找类的具体函数。- 直接使用 sm java.math.RoundingMode
- 通过
-d
参数可以打印函数的具体属性:sm -d java.math.RoundingMode - 也可以查找特定的函数,比如查找构造函数:sm java.math.RoundingMode
-
可以通过
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}'
- 第一个参数是类名,支持通配
- 第二个参数是函数名,支持通配
如果想把获取到的结果展开,可以用-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 能做什么
- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
- 是否有一个全局视角来查看系统的运行状况?
- 有什么办法可以监控到JVM的实时运行状态?
- 怎么快速定位应用的热点,生成火焰图?
- 怎样直接从JVM内查找某个类的实例?
一、基本使用
- 启动 Java 程序后运行 arthas-boot.jar 。
- 选择进程号进行 Attach,Attach 成功后会打印 arthrs 的 logo 。
- dashboard 命令可以查看当前系统的实时数据面板,q 退出。
- thread 1 命令打印线程 ID 为 1 的栈。
- sc -d *MathGame 可以通过
sc
命令来查找JVM里已加载的类。 - 可以通过
jad
命令来反编译代码:jad demo.MathGame(类限定名) - 通过
watch
命令可以查看函数的参数/返回值/异常信息:watch demo.MathGame primeFactors returnObj(q退出) - 通过
vmtool
命令,可以搜索内存对象:vmtool --action getInstances --className java.lang.String --limit 10
二、进阶使用
-
前四步同上
-
sysprop
可以打印所有的System Properties信息。(含有类如 java 版本,jvm 版本,用户时区,用户 home目录等)- 指定单个key:
sysprop java.version
- 通过
grep
来过滤:sysprop | grep user
- 设置新的value:
sysprop testKey testValue
- 指定单个key:
-
sysenv
命令可以获取到环境变量。和sysprop
命令类似。 -
jvm
命令会打印出JVM
的各种详细信息。 -
每一个命令都有详细的帮助信息。可以用
-h
来查看。比如:sysprop -h -
sc
命令可以查找到所有JVM已经加载到的类。- 如果搜索的是接口,还会搜索所有的实现类。比如查看所有的
Filter
实现类:sc javax.servlet.Filter - 通过
-d
参数,可以打印出类加载的具体信息,很方便查找类加载问题。sc -d javax.servlet.Filter(非常详细) sc
支持通配,比如搜索所有的StringUtils
:sc *StringUtils
- 如果搜索的是接口,还会搜索所有的实现类。比如查看所有的
-
sm
命令则是查找类的具体函数。- 直接使用 sm java.math.RoundingMode
- 通过
-d
参数可以打印函数的具体属性:sm -d java.math.RoundingMode - 也可以查找特定的函数,比如查找构造函数:sm java.math.RoundingMode
-
可以通过
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}'
- 第一个参数是类名,支持通配
- 第二个参数是函数名,支持通配
如果想把获取到的结果展开,可以用-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'