线上问题定位之一——arthas
arthas
入门
- yum install java-1.8.0-openjdk
- 1、安装jdk 如果系统环境中已经安装过不用重复安装
- curl -O https://alibaba.github.io/arthas/arthas-boot.jar
- 2、安装arthas-boot.jar文件
- java -jar arthas-boot.jar --target-ip 127.0.0.1
- /home/admin/jdk1.8.0_65/bin/java -jar arthas-boot.jar --telnet-port 9999
- 3、启动arthas
- 启动成功后会打印运行中的java进程
- 选择一个序号按回车
- dashboard 可以实时查看Thread,Memory,os的信息
- jad + 全路径名可以查看对象的反编译信息
- thread 可以列出所有线程信息
- watch + 全路径名 + 方法名 + returnObj查看返回返回值
- jad命令反编译,然后可以用其它编译器,比如vim来修改源码
- mc命令来内存编译修改过的代码
- 用redefine命令加载新的字节码
- /home/admin/jdk1.8.0_65/bin/java -jar arthas-client.jar 127.0.0.1 9999 -c “stop”
- 4、退出arthas
watch
- watch io.terminus.taurus.server.manager.RoleQueryManager checkIfExisted “{params,returnObj}” -x 10
trace
- trace com.morningglory.mvc.service.item.ItemServiceImpl unsafeBuy
tt 方法执行的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测
- tt -t com.morningglory.mvc.controller.StudentController listByName 记录下当前方法的每次调用环境现场
- tt -s ‘method.name==“listByName”’ 筛选出 listByName 方法的调用信息
- tt -l 查看记录列表
- tt -i 对于具体一个时间片的信息而言,你可以通过 -i 参数后边跟着对应的 INDEX 编号查看到他的详细信息
- tt -i [INDEX] -p 重新发起调用
sc 查看jvm加载的类信息
- sc com.morningglory.* 模糊搜索
- sc -d com.morningglory.mvc.service.item.ItemServiceImpl 打印类的详细信息
sm “Search-Method” 的简写,查看已经加载了 Class 信息的方法信息
- sm com.morningglory.mvc.service.item.ItemService
- sm -d com.morningglory.mvc.service.item.ItemService add
jad 反编译指定已加载类的源码
- jad com.morningglory.mvc.service.item.ItemServiceImpl
- jad --source-only com.morningglory.mvc.service.item.ItemServiceImpl E n h a n c e r B y S p r i n g C G L I B EnhancerBySpringCGLIB EnhancerBySpringCGLIBdc0687de 反编译时只显示源代码
- jad com.morningglory.mvc.service.item.ItemServiceImpl E n h a n c e r B y S p r i n g C G L I B EnhancerBySpringCGLIB EnhancerBySpringCGLIBdc0687de add 反编译指定的方法
stack 输出当前方法被调用的调用路径
- stack com.morningglory.mvc.controller.StudentController listByName ‘params[0] == “te”’ 查看listByName方法第一个参数是te的调用链路
logger
- logger 查看系统log配置
- logger --name ROOT --level debug 更新log日志级别
vmoption 查看,更新VM诊断相关的参数
- vmoption 查看所有option
- vmoption PrintGCDetails 查看指定option
- vmoption PrintGCDetails true 更新指定的option
线上代码增加日志
- 反编译线上代码,并在需要出增加日志
- 编译修改后的代码
- 重新加载指定的class文件
- jad --source-only com.morningglory.mvc.controller.ItemController > /Users/nsh/Desktop/com/morningglory/mvc/controller/ItemController.java
- mc /Users/nsh/Desktop/com/morningglory/mvc/controller/ItemController.java -d /Users/nsh/Desktop
- redefine /Users/nsh/Desktop/com/morningglory/mvc/controller/ItemController.class