摘要:最近在项目中遇到一个问题,客户那边部署的项目线上出现了问题,需要远程调试,单凭log日志很难判断问题出现的原因,且无法进行远程debug调。,一开始是通过加日志的方式去排查问题,但日志加上之后还需要重新部署,这样来来回回部署了好几次,这方案非常浪费时间。了解到Arthas开源工具可以解决以上痛点,所以研究了一下简单的使用调试。
Arthas可以解决:
(1).这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
(2).我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
(3).遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
(4).线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
(5).是否有一个全局视角来查看系统的运行状况?
(6).有什么办法可以监控到 JVM 的实时运行状态?
(7).怎么快速定位应用的热点,生成火焰图?
(8).怎样直接从 JVM 内查找某个类的实例?
安装部署方式很简单,只需一条命令
curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar
运行截图如下,启动之后会出现你的服务器部署的jar包程序,可以输入数字序号选择要调试哪个jar程序。
可能会出现端口占用情况:
原因:上一次选择进程进行连接没有正常退出,arthas会保存上一次监听进程,导致本次选择新进程进行连接时,与监听中记录的进程id不同,结果出现错误。
解决:继续选择上一个进程进行连接,执行成功后执行 stop 命令结束连接。再次启动arthas,选择新进程即可进行连接。
主要调试命令:
watch命令:
特别说明
watch 命令定义了4个观察事件点,即 -b 方法调用前,-e 方法异常后,-s 方法返回后,-f 方法结束后
4个观察事件点 -b、-e、-s 默认关闭,-f 默认打开,当指定观察点被打开后,在相应事件点会对观察表达式进行求值并输出
这里要注意方法入参和方法出参的区别,有可能在中间被修改导致前后不一致,除了 -b 事件点 params 代表方法入参外,其余事件都代表方法出参
当使用 -b 时,由于观察事件点是在方法调用前,此时返回值或异常均不存在
监听某个方法的返回值,如下图:
监听某个方法的参数,如下图:
线上环境可能会出现某个方法执行过于频繁,导致日志打印太多,不易查找日志的主要信息,此时可以开启保存到日志文件:
开启日志保存
arthas日志输出是默认关闭的,需要主动开启,开启步骤(前提需要启动Arthas)。
options save-result true
标签:java,Arthas,jar,开源,arthas,日志,方法 From: https://www.cnblogs.com/yylucky666/p/18665418