2023京东黑客马拉松初赛答辩文稿

56 次浏览
2023年09月10日创建

page1(10s):各位评委、同事们好,我本次2023黑马初赛答辩的项目是JDebugger,主题是效率-后端。主持人,下一页。

page2(5s):接下来我将按照下面六个部分对本次jdebugger初赛实现的内容进行介绍。下一页。

page3(5s):这是我们本次参赛队伍的简单介绍,下一页。

page4(35s):我们首先来看一下项目简介,jdebugger是一种无需额外开通端口就能够让开发人员在Web端对预发、甚至是生产环境的Java代码进行调试的轻量级debug工具。它不仅支持基础的debug能力如step over单步、step into进入方法、step out跳出方法、resume释放到下一个断点、flush刷新、stop停止等;右侧是我们已经实现的gif图,同时还支持一些自主实现的高级能力, 比如支持两种调试模式,即一人调试多人围观以及多人并行调试模式,同时还支持热替换的能力。下一页。

page5(50s):这是我们本次初赛实现的整体界面,左上角是搜索框,可以输入关键词搜索目标类,当选中某个搜索结果点击时,右侧就会自动加载该类的源码,界面的左侧部分实现的是项目的maven模块路径树展示,多个module依次排列。界面的右下角展示的是当前用户添加的全部断点,当其中某个断点正处于断点中时,颜色将标记为红色,右边两个按钮是mute和clear,可以禁用或者清空当前所有断点。界面的右侧部分是源码区,当源码中的某行代码打了断点后,此时程序运行到该断点行,请求线程就会block住,并将该行渲染为红色背景,而此时下方的基础debug能力区按钮会变为亮色,表示用户可以操作断点下一步、进入方法、退出方法等。每次断点变更时会在界面的最下方打印所有当前断点涉及的全部局部变量、实例变量。而用户操作日志以及程序中的运行日志都会在界面中console tab内打印,并且实时滚动到最下方。右上角是我们实现的hotswap和debug dump,hotswap能力用于当发现bug,开发人员修复后,通过文件上传替换运行中的类,快速支持调试,而debug dump可以用来帮助JDebugger工具开发者对接入方排障使用,从而快速定位工具问题。以上的所有部分后面demo会整体展示。主持人下一页。

page6(35s):这页是我们实现的整体功能,分为4个部分包括项目集成、断点调试、辅助分析以及代码修复,用于帮助用户进行一体化调试,发现并解决项目中存在的问题。业务项目首先通过引入debug jar后,并在maven compile中加入-D参数,编译部署完成后,即可通过浏览器进行调试。如果不加-D参数,等同于不引入debugger SDK,做到了真正的环境隔离,同时也实现了绝对的轻量。而jdebugger实现的整体能力如中间部分所示,包含了典型的调试能力外,同时还实现了一些辅助分析能力,比如日志输出、debug dump,高级能力实现了如hotswap热替换,多人并行调试,本次因时间原因,暂未实现,但整体方案已经制定。主持人,下一页。

page7(35s)下面来看一下路径、源码、条件表达式的技术实现细节,路径树的实现中,我们在javac编译期间,在java源文件编译时获取类所在的module名称,相同的module名称的类通过element tree渲染到同一个package下,而package名就是该module名称。

源码的获取也是在编译期间,获取源码,同时通过修改抽象语法树注入debug能力,并将最终的结果保存在jar中,当项目启动时将所有的类加载到内存,当前端请求展示源码时,将debug ability格式化成前端标签,这种方式保证了调试的代码与服务器代码绝对一致。

下面是实现了条件断点,我们通过jexl表达式引擎支持在断点处通过鼠标右键添加条件,这些条件其中包括各类操作符,数组访问、属性访问以及一些集合操作,达成当满足该条件时,线程会在该断点处block,否则该断点会自动放行,这部分会在后面demo时进行演示。主持人,下一页。

page8(35s)下面再看看我们的日志以及热替换的技术实现,我们通过在jdebugger中自定义loback appender,注入到业务项目中,用于获取业务方输出日志,每次断点信息发生变更,日志区域将实时滚动到界面最下方,用于查看最新的业务输出日志。

在热替换的实现中,我们将修复bug后的java源文件,通过jdebugger页面的热替换按钮,将源码上传到服务器,服务器内通过java compiler将原文件编译成class文件,通过instrument进行redefineClass实现java文件的热替换。主持人下一页。

page9(20s)我们对jdebugger做了性能基准测试,在服务器环境下,对新农场首页接口进行压测,不开启debug能力和开启debug能力的平均响应时间持平,可见在ios密集型下,性能影响依赖于网络环境。而在本机纯CPU内存计算下,性能损耗略有增加,我们后续我们将更加完善性能基准测试。主持人,下一页。

page10(20):业务贡献我们总结有3点,第一是成本、效率,工具主要是帮助开发在自测、链条、测试、上线阶段快速定位和修复代码中的问题,从而提高研发效率,同时在预发调试中无需申请额外的负载均衡资源。在多人并行调试的模式下呢,多个人同时进行调试也无需申请更多的服务器资源。第二点覆盖人群,我东目前大部分是java开发工程师,所以这个工具应用后覆盖面较广。第三点是这个工具拥有独立的知识产权,不受开源协议的约束。主持人,下一页。

page11(20):后续迭代中,我们将在4个点上进行迭代。一是在功能、兼容性上做到更加完善,完成多人并行调试,融合spring发行版本。二是在性能、安全方面提升优化,完善性能基准测试,根据基准测试结果让业务负责人自行评估是否开启生产环境调试。三是合作共建,通过与集团内平台打通,比如行云部署,支持部署完成后,一键跳转调试页面,达成构建、编译、部署、运行、调试一体化体验。四是开源提升,发不到集团内部开源平台,提升技术影响力,共同进步,主持人下一页。

最终page(5s)上面就是我们本次初赛黑马答辩的ppt内容,下面进行demo演示。

问题

1、是不是两天内做出来的

回答:初赛前我们进行过可行性验证,并在框架层面进行定义,但核心流程和代码都是初赛期间实现。

2、如何保证调试代码和服务器代码一致

回答:上面ppt中源码获取时已经讲过了,在编译期间,我们知道类的源码,我们通过修改抽象语法树后,将最终的源码保存在最终生成的jar中,并在系统初始化时,将其加载到内存中,前端渲染时,将源码展示给前端。

3、添加、取消断点是怎么实现的?

回答:事实上,前端的源码是后端返回的,我们在每行代码中,标记了该行的断点号以及当前类名,当点击代码行前的小圆点,将出发ajax请求,将类名和断点号传给后端,后端记录该类存在该断点,此时前端重新渲染页面,后端将该行有断点的样式返回给前端,同理取消断点。

4、局部变量的值如何获取的?

回答:我们在编译期间,修改抽象语法树时,遍历每个类的方法,如果该行代码时一个字段定义,将其加入到本类方法

5、热替换怎么实现?

回答:在ppt中我们已经讲过了,将修复bug后的java源文件,通过jdebugger页面的热替换按钮,将源码上传到服务器,服务器内通过java compiler将原文件编译成class文件,通过instrument进行redefineClass实现java文件的热替换。