在线应用云调试系统--Zdebugger

该文章来自于阿里巴巴技术协会(ATA)精选文章。

缘起

早在今年(2014)的JavaOne大会上来自google的speaker---Ludovic Champenois提到了他们的一个新产品cloud debugger,主要是用来调试部署在他们云端的应用的,但是会上并没有透露太多的细节。当我们第一次听说这种调试系统居然是一个web实现时还是觉得挺不可思议的,说到调试我们一般想到的是Eclipse,Idea等IDE,但是仔细想想随着现在云概念的不断普及应用,出现这类系统也是一种必然。即使我们抛开云概念不说,就我们现实中的情况来看,当我们线上的系统出现一些问题的时候,又担心重启之后问题无法重现,作为程序员的你或许并没有第一时间想到进行线程dump,内存dump,然后使用我们的性能分析工具zprofiler进行分析,而是想要是可以使用eclipse直接连上去调试下就好了,哪怕只要能看看某个属性或者变量的值也好,可事实是我们的线上和线下环境是隔离的,根本无法从线下连到线上去。基于这些情况,我们觉得设计实现类似的产品也是很有必要的,于是有了本文要介绍的主角---Zdebugger。

之于Eclipse

Eclipse或许是我们最常用的Java IDE,它的debug模块也基本能满足我们的日常需求,但是不知道你有没有想过类似的问题:

  • 为什么不能调线上应用呢?或许这不是Eclipse的错,不过事实就是这样
  • 远程调试应用为什么一定要目标jvm启动的时候就开启调试端口呢?
  • 远程调试时只能一个用户连上去?想几个人一起通过debug查下问题都不行
  • 断点设置在一个通用的地方,因为请求量大,线程瞬间都阻塞了?
  • Eclipse忘带了?哈哈,当然这个不太会发生

Zdebugger的设计我们主要针对上面的场景分别提供了一些解决方案:

  • 部署一套到线上,就可以解决因为环境问题而导致的不可能,线上应用也可以调起来
  • 我们提供late attach的机制,能在目标jvm中将JDWP(Java Debug Wire Protocol) agent在运行期动态加载起来,而不需要在应用启动的时候就加上jdwp agent,目前我们正在进行测试
  • 提供了watch point的调试模式,对于同一个应用大家都可以上去设置断点,然后经过断点的时候Zdebugger会将一些变量信息,线程信息推给你,断点是分用户的噢
  • 一个断点只断住一个线程就可以解决断点在通用位置导致线程都阻塞而手忙脚乱的问题了
  • eclipse不在身边,有浏览器就行,Zdebugger设计成了一个web系统,无需安装,想什么时候用就什么时候用

Zdebugger调试模式

Single Step调试模式

这种模式是我们大家都熟悉的使用最广的调试模式,也就是代码一行行一步步地调试,最常用的几种操作:

  • step into(F5):进入到方法里
  • step over(F6):转到当前方法的下一行,如果当前方法结束了相当于下面的step out
  • step out(F7):跳出当前方法,进入到调用者的方法里
  • continue(F8):跳过当前断点,执行完后面的逻辑

当然还有目标进程连接/断连接,设置/清除断点,查看表达式/变量/属性等操作

总的来说这种模式当断点到了的时候是至少需要suspend一个线程的,通过设置还可以suspend整个vm,将所有线程都suspend,直到你执行了continue。

『一人调试,多人围观』

这是在single step调试模式下提供的一个有意思的功能,当某个人通过single step模式对某个系统进行调试的时候,另外的人虽然不能干预他的调试过程,但是可以观察他的调试过程,当然不是大家围观在调试者的旁边看着他操作,而是在自己的电脑上通过Zdebugger的首页选中正在被调试的使用single step模式调试的机器进行接入,这个时候调试者的任何一个操作结果,比如文件跳转,线程堆栈变化等都将在您的页面里进行展示。

Watch Point调试模式

对于这种模式或许你很陌生,之前可能完全没有听说过,其实google的cloud debugger就是使用的这种模式,在某些情况下上面的Single Step调试模式根本不可行,比如我们线上的系统,如果让你一步步调试, 线程阻塞了,对系统的处理能力也下降了,系统资源更是一个浪费,因此我们需要另外一种模式,也就是这里要说的Watch Point调试模式,这种模式之于Single Step调试模式最大的区别是不需要人工进行上面的一系列单步操作,当然设置断点这些还是需要的,线程也不会一直suspend,而且支持多人同时设置断点进行调试。

具体过程是当断点到了的时候,Zdebugger会将线程堆栈,局部变量等值都取出来,然后反馈到关注该断点的用户,不过由于jdwp协议的缘故,目前还不能做到变量一层层递归找出所有值,只递归取了四层的数据,不过我们现在正在考虑通过jvmti接口来解决这种缺陷,从google的cloud debugger来看好像解决了这个问题,不知道他们是从jvm上解决的,还是和我们目前这样解决的,因为只能看到他们的截图,无法体验他们的产品,所以也不知道他们究竟是如何的。

当数据反馈到前端之后,该断点会自动clear,除非您重新开启该断点,开启操作只需要在断点列表里的断点前的checkbox里勾上就可以了。

『多人同时在线调试』

这是watch point模式下特有的一个功能,在这种模式下由于不能单步调试应用,那么我们可以支持多人同时设置断点了。原理其实很简单,zdebugger可以根据断点进行分类,哪些人关注哪些断点,然后当某个断点到了的时候将经过此断点时的线程堆栈,局部变量等推给对应的用户,当然同一个断点可以有不同的人关注。

Zdebugger其他特性

  • 支持支付宝环境的svn和gitlab source自动下载
  • 支持Maven项目展示
  • 支持文件搜索
  • 支持特定文件在source tree里的树状定位展示
  • 支持每个线程栈每一帧的局部变量获取展示
  • 支持临时表达式
  • 支持断点表达式
  • 支持三方包+jdk+svn source的文件间的跳转
  • 支持内部类和同文件里多类的断点设置

个人公众号:

在线应用云调试系统--Zdebugger

上一篇:喷漆室的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告


下一篇:《Cacti实战》——2.2 安装与配置相关组件和服务