学习arthas(十四)方法执行时的时空隧道
Arthasadmin 发布于:2023-10-02 17:47:01
阅读:loading
很多时候有很多的问题由于不同的运行环境所在操作系统的不同,数据的不同,用户的不同等多种多样的因素存在,导致某些程序代码运行的有一些潜在问题,但这样的问题往往很难在线下开发测试环境去复现,导致一些问题的分析解决变得困难重重。
arthas的tt命令是方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测。watch 虽然很方便和灵活,但需要提前想清楚观察表达式的拼写,这对排查问题而言要求太高,因为很多时候我们并不清楚问题出自于何方,只能靠蛛丝马迹进行猜测。这个时候如果能记录下当时方法调用的所有入参和返回值、抛出的异常会对整个问题的思考与判断非常有帮助。于是乎,TimeTunnel 命令就诞生了————“对于一个最基本的使用来说,就是记录下当前方法的每次调用环境及请求与响应现场。”
(1)监控某个类的某些方法,在监控的时间段内,输出存在的方法调用列表,相关的数据列有:索引、执行时间、耗时、正常返回、异常返回、对象HashCode、类、方法,参考如下列表如下:
(2)查看某个索引数据的当前实例对象,也可以查看DruidDataSource的参数信息,如username、password等关键信息,参考如下图所示:
(3)查看某个索引数据的当前实例对象
(4)查看某个索引数据的调用执行明细,可以看到本次请求的时间、请求的类和方法、请求参数、返回数据等
(5)按方法名称筛选,比grep二次筛选的要科学
(按方法名称筛选)
(6)***重新调用某个索引,将按照之前该索引被执行时传递的参数重新触发,tt 命令由于保存了当时调用的所有现场信息,所以我们可以自己主动对一个 INDEX 编号的时间片自主发起一次调用,从而解放你的沟通成本。此时你需要 -p 参数。通过 --replay-times 指定 调用次数,通过 --replay-interval 指定多次调用间隔(单位 ms, 默认 1000ms)
(7)观察表达式“-w, --watch-express”使用表达式核心变量中所有变量作为已知条件编写表达式。也可以用于获取类的静态字段、调用类的静态方法。
(8)条件表达式、解决方法重载(方法参数个数、方法参数类型、解决指定参数)。
需要强调的点
ThreadLocal 信息丢失
很多框架偷偷的将一些环境变量信息塞到了发起调用线程的 ThreadLocal 中,由于调用线程发生了变化,这些 ThreadLocal 线程信息无法通过 Arthas 保存,所以这些信息将会丢失。
引用的对象
需要强调的是,tt 命令是将当前环境的对象引用保存起来,但仅仅也只能保存一个引用而已。如果方法内部对入参进行了变更,或者返回的对象经过了后续的处理,那么在 tt 查看的时候将无法看到当时最准确的值。这也是为什么 watch 命令存在的意义。
Session失效
若存在Session中获取数据的逻辑,会存在session数据无法获取的情况。
缓存过期
若存在从缓存中获取数据的逻辑,若缓存已过期也可能会出现无法获取的情况。
点赞
发表评论
评论列表
留言区
- 开篇学习arthas啦
- 学习arthas(一)安装与入门介绍
- 学习arthas(二)Web Console控制台
- 学习arthas(三)命令大全与简单命令
- 学习arthas(四)系统命令
- 学习arthas(五)类命令
- 学习arthas(六)增强命令
- 学习arthas(七)arthas-tunnel-server的摸索
- 学习arthas(八)查找某个被加载的类
- 学习arthas(九)动态执行一些代码
- 学习arthas(十)方法执行结果监控
- 学习arthas(十一)输出方法调用栈
- 学习arthas(十二)跟踪方法代码的执行
- 学习arthas(十三)监视代码的执行结果
- 学习arthas(十五)无侵入的热部署
- 学习arthas(十六)热点功能火焰图