寒泉子 2015-12-08 6017浏览量
早在今年(2014)的JavaOne大会上来自google的speaker---Ludovic Champenois提到了他们的一个新产品cloud debugger,主要是用来调试部署在他们云端的应用的,但是会上并没有透露太多的细节。当我们第一次听说这种调试系统居然是一个web实现时还是觉得挺不可思议的,说到调试我们一般想到的是Eclipse,Idea等IDE,但是仔细想想随着现在云概念的不断普及应用,出现这类系统也是一种必然。即使我们抛开云概念不说,就我们现实中的情况来看,当我们线上的系统出现一些问题的时候,又担心重启之后问题无法重现,作为程序员的你或许并没有第一时间想到进行线程dump,内存dump,然后使用我们的性能分析工具zprofiler进行分析,而是想要是可以使用eclipse直接连上去调试下就好了,哪怕只要能看看某个属性或者变量的值也好,可事实是我们的线上和线下环境是隔离的,根本无法从线下连到线上去。基于这些情况,我们觉得设计实现类似的产品也是很有必要的,于是有了本文要介绍的主角---Zdebugger。
Eclipse或许是我们最常用的Java IDE,它的debug模块也基本能满足我们的日常需求,但是不知道你有没有想过类似的问题:
Zdebugger的设计我们主要针对上面的场景分别提供了一些解决方案:
这种模式是我们大家都熟悉的使用最广的调试模式,也就是代码一行行一步步地调试,最常用的几种操作:
当然还有目标进程连接/断连接,设置/清除断点,查看表达式/变量/属性等操作
总的来说这种模式当断点到了的时候是至少需要suspend一个线程的,通过设置还可以suspend整个vm,将所有线程都suspend,直到你执行了continue。
这是在single step调试模式下提供的一个有意思的功能,当某个人通过single step模式对某个系统进行调试的时候,另外的人虽然不能干预他的调试过程,但是可以观察他的调试过程,当然不是大家围观在调试者的旁边看着他操作,而是在自己的电脑上通过Zdebugger的首页选中正在被调试的使用single step模式调试的机器进行接入,这个时候调试者的任何一个操作结果,比如文件跳转,线程堆栈变化等都将在您的页面里进行展示。
对于这种模式或许你很陌生,之前可能完全没有听说过,其实google的cloud debugger就是使用的这种模式,在某些情况下上面的Single Step调试模式根本不可行,比如我们线上的系统,如果让你一步步调试, 线程阻塞了,对系统的处理能力也下降了,系统资源更是一个浪费,因此我们需要另外一种模式,也就是这里要说的Watch Point调试模式,这种模式之于Single Step调试模式最大的区别是不需要人工进行上面的一系列单步操作,当然设置断点这些还是需要的,线程也不会一直suspend,而且支持多人同时设置断点进行调试。
具体过程是当断点到了的时候,Zdebugger会将线程堆栈,局部变量等值都取出来,然后反馈到关注该断点的用户,不过由于jdwp协议的缘故,目前还不能做到变量一层层递归找出所有值,只递归取了四层的数据,不过我们现在正在考虑通过jvmti接口来解决这种缺陷,从google的cloud debugger来看好像解决了这个问题,不知道他们是从jvm上解决的,还是和我们目前这样解决的,因为只能看到他们的截图,无法体验他们的产品,所以也不知道他们究竟是如何的。
当数据反馈到前端之后,该断点会自动clear,除非您重新开启该断点,开启操作只需要在断点列表里的断点前的checkbox里勾上就可以了。
这是watch point模式下特有的一个功能,在这种模式下由于不能单步调试应用,那么我们可以支持多人同时设置断点了。原理其实很简单,zdebugger可以根据断点进行分类,哪些人关注哪些断点,然后当某个断点到了的时候将经过此断点时的线程堆栈,局部变量等推给对应的用户,当然同一个断点可以有不同的人关注。
个人公众号:
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
集结各类场景实战经验,助你开发运维畅行无忧