Arthas to Detecting Online Server Problem


官方文档 如是说:

Arthas 是 Alibaba 开源的 Java 诊断工具,深受开发者喜爱。

Arthas 可以帮助你解决:

  • 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
  • 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
  • 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
  • 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
  • 是否有一个全局视角来查看系统的运行状况?
  • 有什么办法可以监控到JVM的实时运行状态?
  • Arthas支持 JDK 6+,采用命令行交互模式,同时提供丰富的 Tab 自动补全功能,进一步方便进行问题的定位和诊断。

快速开始

$ wget https://alibaba.github.io/arthas/arthas-boot.jar
$ java -jar arthas-boot.jar [-h]

使用案例

排查 Session 过期问题,启动 arthas 并输入目标进程 ID

// 查看JVM已加载的类信息
$ sc -d javax.servlet.http.HttpSession
 class-info        com.bj58.sso.session.servlet.session.CacheHttpSession                       
 code-source       file:/data1/swan/swan-0.0.1-SNAPSHOT.jar!/lib/gsso-client-1.1.3.jar!/       
 name              com.bj58.sso.session.servlet.session.CacheHttpSession                       
 isInterface       false                                                                       
 isAnnotation      false                                                                       
 isEnum            false                                                                       
 isAnonymousClass  false                                                                       
 isArray           false                                                                       
 isLocalClass      false                                                                       
 isMemberClass     false                                                                       
 isPrimitive       false                                                                       
 isSynthetic       false                                                                       
 simple-name       CacheHttpSession                                                            
 modifier          public                                                                      
 annotation                                                                                    
 interfaces        javax.servlet.http.HttpSession                                              
 super-class       +-java.lang.Object                                                          
 class-loader      +-org.springframework.boot.loader.LaunchedURLClassLoader@8efb846            
                     +-sun.misc.Launcher$AppClassLoader@33909752                               
                       +-sun.misc.Launcher$ExtClassLoader@295a0382                             
 classLoaderHash   8efb846                                                                     

 class-info        javax.servlet.http.HttpSession                                              
 code-source       file:/data1/swan/swan-0.0.1-SNAPSHOT.jar!/lib/tomcat-embed-core-8.0.33.jar!/
 name              javax.servlet.http.HttpSession                                              
 isInterface       true                                                                        
 isAnnotation      false                                                                       
 isEnum            false                                                                       
 isAnonymousClass  false                                                                       
 isArray           false                                                                       
 isLocalClass      false                                                                       
 isMemberClass     false                                                                       
 isPrimitive       false                                                                       
 isSynthetic       false                                                                       
 simple-name       HttpSession                                                                 
 modifier          abstract,interface,public                                                   
 annotation                                                                                    
 interfaces                                                                                    
 super-class                                                                                   
 class-loader      +-org.springframework.boot.loader.LaunchedURLClassLoader@8efb846            
                     +-sun.misc.Launcher$AppClassLoader@33909752                               
                       +-sun.misc.Launcher$ExtClassLoader@295a0382                             
 classLoaderHash   8efb846                                                                     

Affect(row-cnt:2) cost in 204 ms.

确认是否加载的类与预期的一致,如果不一致,那么恭喜,已经找到问题了。如果一致,那么继续

// 反编译该类代码
$ jad com.bj58.sso.session.servlet.session.CacheHttpSession

ClassLoader: 
+-org.springframework.boot.loader.LaunchedURLClassLoader@8efb846 
  +-sun.misc.Launcher$AppClassLoader@33909752   
    +-sun.misc.Launcher$ExtClassLoader@295a0382

Location: 
file:/data1/swan/swan-0.0.1-SNAPSHOT.jar!/lib/gsso-client-1.1.3.jar!/
...

如代码查查看不出问题,那么继续,观察方法执行数据

$ watch com.bj58.sso.session.cache.support.WTableEngine get "{params,returnObj}" -x 3 -b -s
Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 161 ms.
...

watch 函数的执行前后数据的变化,确认是否正常。在我排查问题的过程中,在这一步定位出数据参数问题,然后结合该类反编译源码,最终确认问题所在。