arthas之tt/options命令基本使用
文章目录
1. tt
-
作用:time-tunnel 时间隧道
-
记录下指定方法每次调用的入参和返回信息,并能对这些不同时间下调用的信息进行观测
-
介绍
watch虽然很方便和灵活,但需要提前想清楚观察表达式的拼写,这对排查问题而言要求太高,因为很多时候我们并不清楚问题出自于何方,只能靠蛛丝马迹进行猜测。这个时候如果能记录下当时方法调用的所有入参和返回值、抛出的异常会对整个问题的思考与判断非常有帮助。
于是乎,TimeTunnel 命令就诞生了。
- 参数解析
| tt的参数 | 说明 |
|---|---|
| -t | 记录某个方法在一个时间段中的调用 |
| -l | 显示所有已经记录的列表 |
| -n 次数 | 只记录多少次 |
| -s 表达式 | 搜索表达式 |
| -i 索引号 | 查看指定索引号的详细调用信息 |
| -p | 重新调用指定的索引号时间碎片 |
-
-ttt 命令有很多个主参数,
-t就是其中之一。这个参数表明希望记录下类*Test的print方法的每次执行情况。 -
-n 3当你执行一个调用量不高的方法时可能你还能有足够的时间用
CTRL+C中断 tt 命令记录的过程,但如果遇到调用量非常大的方法,瞬间就能将你的 JVM 内存撑爆。此时你可以通过
-n参数指定你需要记录的次数,当达到记录次数时 Arthas 会主动中断tt命令的记录过程,避免人工操作无法停止的情况。
使用案例
- 基本使用
最基本的使用来说,就是记录下当前方法的每次调用环境现场。
tt -t demo.MathGame primeFactors


表格字段说明
| 表格字段 | 字段解释 |
|---|---|
| INDEX | 时间片段记录编号,每一个编号代表着一次调用,后续tt还有很多命令都是基于此编号指定记录操作,非常重要。 |
| TIMESTAMP | 方法执行的本机时间,记录了这个时间片段所发生的本机时间 |
| COST(ms) | 方法执行的耗时 |
| IS-RET | 方法是否以正常返回的形式结束 |
| IS-EXP | 方法是否以抛异常的形式结束 |
| OBJECT | 执行对象的hashCode(),注意,曾经有人误认为是对象在JVM中的内存地址,但很遗憾他不是。但他能帮助你简单的标记当前执行方法的类实体 |
| CLASS | 执行的类名 |
| METHOD | 执行的方法名 |
-
条件表达式
不知道大家是否有在使用过程中遇到以下困惑
- Arthas 似乎很难区分出重载的方法
- 我只需要观察特定参数,但是 tt 却全部都给我记录了下来
条件表达式也是用
OGNL来编写,核心的判断对象依然是Advice对象。除了tt命令之外,watch、trace、stack命令也都支持条件表达式。 -
解决方法重载
tt -t *Test print params.length==1通过制定参数个数的形式解决不同的方法签名,如果参数个数一样,你还可以这样写
tt -t *Test print 'params[1] instanceof Integer' -
解决指定参数
tt -t *Test print params[0].mobile=="13989838402"
检索调用记录
当你用 tt 记录了一大片的时间片段之后,你希望能从中筛选出自己需要的时间片段,这个时候你就需要对现有记录进行检索。
tt -l

需要筛选出 primeFactors 方法的调用信息
tt -s 'method.name=="primeFactors"'

查看调用信息
对于具体一个时间片的信息而言,你可以通过 -i 参数后边跟着对应的 INDEX 编号查看到他的详细信息。
tt -i 1002


重做一次调用
当你稍稍做了一些调整之后,你可能需要前端系统重新触发一次你的调用,此时得求爷爷告奶奶的需要前端配合联调的同学再次发起一次调用。而有些场景下,这个调用不是这么好触发的。
tt 命令由于保存了当时调用的所有现场信息,所以我们可以自己主动对一个 INDEX 编号的时间片自主发起一次调用,从而解放你的沟通成本。此时你需要 -p 参数。通过 --replay-times 指定 调用次数,通过 --replay-interval 指定多次调用间隔(单位ms, 默认1000ms)
tt -i 1002 -p

小结
作用:记录指定方法每次调用的入参和返回值,并后期还可以对这些信息进行观测
| tt的参数 | 说明 |
|---|---|
| -t | 记录方法在一个时间段中调用 |
| -l | 显示所有已经记录的列表 |
| -n 次数 | 只记录多少次 |
| -s 搜索表达式 | 指定搜索表达式 |
| -i 索引号 | 查看它的详细信息 |
2. options
- 作用:全局开关
全局选项
| 名称 | 默认值 | 描述 |
|---|---|---|
| unsafe | false | 是否支持对系统级别的类进行增强,打开该开关可能导致把JVM搞挂,请慎重选择! |
| dump | false | 是否支持被增强了的类dump到外部文件中,如果打开开关,class文件会被dump到/${application dir}/arthas-class-dump/目录下,具体位置详见控制台输出 |
| batch-re-transform | true | 是否支持批量对匹配到的类执行retransform操作 |
| json-format | false | 是否支持json化的输出 |
| disable-sub-class | false | 是否禁用子类匹配,默认在匹配目标类的时候会默认匹配到其子类,如果想精确匹配,可以关闭此开关 |
| debug-for-asm | false | 打印ASM相关的调试信息 |
| save-result | false | 是否打开执行结果存日志功能,打开之后所有命令的运行结果都将保存到~/logs/arthas-cache/result.log中 |
| job-timeout | 1d | 异步后台任务的默认超时时间,超过这个时间,任务自动停止;比如设置 1d, 2h, 3m, 25s,分别代表天、小时、分、秒 |
| print-parent-fields | true | 是否打印在parent class里的filed |
案例
查看所有的options
options

获取option的值
options json-format

设置指定的option
例如,想打开执行结果存日志功能,输入如下命令即可:
options save-result true

小结
options的作用是:查看或设置arthas全局环境变量
更多推荐




所有评论(0)