写点什么

有赞云应用远程调试工具

  • 2020-02-25
  • 本文字数:2571 字

    阅读完需:约 8 分钟

有赞云应用远程调试工具

一、背景和简介

1.1 背景

电商云有容器应用场景下,第三方外部开发者的应用是托管在我们有赞云平台的容器中的,出于安全以及整个平台稳定性的要求,应用容器执行环境对外部开发者用户都应该是透明黑盒的。而电商云环境下容器应用的运行会直接依赖于电商云平台所提供 Apollo、rds、kvds 等各种底层中间件能力,这就导致外部开发者想要实现应用代码的本地调试几乎是不现实的。同时考虑到复杂的网络环境和安全稳定性的要求,平台也不可能开放用户直接连到线上容器应用中利用 JVM 提供的基于 JDWP 的远程调试功能。外部开发者强烈的调试需求要求我们平台给外部开发者提供一种在电商云环境下的应用的调试能力。

1.2 简介

有赞云应用远程调试工具是一种不侵入应用代码、不打断应用代码执行、尽可能少的影响代码执行效率的前提下,实现线上应用近似本地调试的体验的调试工具。


总体实现思路是通过 java 字节码增强技术对开发者指定的代码类包进行精准增强,在满足设定的命中条件时对应用程序执行过程进行录制生成快照,然后用户使用平台提供的 IDE 回放插件就登录下载快照文件进行本地回放,达到近似本地调试的体验。

二、整体架构

2.1 架构图


上图简要描述了工具的整体架构:


  • IDE 插件主要有状态管理,录制文件管理等模块,通过轮训状态来执行下载文件和回放操作;

  • record-server 是的作用是中枢调度,主要包含三大块:录制管理,沙箱调度,数据管理。

  • 录制管理:管理有赞云应用容器中的沙箱和录制状态;以及拆分 IDE 插件的指令分发给沙箱调度器和数据管理器

  • 沙箱调度:提供有赞云应用容器中可执行的沙箱指令;

  • 数据管理:管理请求录制快照数据;

  • 有赞云环境和有赞云应用容器之间有安全策略,限制请求只能有赞云调用有赞云应用容器的服务;

  • 在有赞云应用容器环境中的数据和状态流转使用的是 kafka 和 flink

2.2 设计上的考量

为了达到项目的总体目标(不侵入应用代码、不打断应用执行、尽可能少的性能损耗、合理的录制数据量),我们项目一期设计上做了一些权衡:


  1. 录制结束后恢复:录制时按需对应用代码字节码增强,录制结束后进行恢复;

  2. 录制范围:应用代码字节码增强后对代码执行效率影响是很大的,考虑到大部分用户只关注自己实现部分的业务代码逻辑的调试,对一些 java 标准类库、第三方包等的深入调试需求很低,所以我们仅对指定包路径下的类代码进行增强录制快照;

  3. 录制场景:完整录制整个应用的执行快照的话,录制性能损耗高、录制数据量大,应对多线程录制并发问题,复杂度高等问题,但大部分应用场景更多的是关心单个线程执行链路的正确性调试,所以我们简化设计——对单线程中某个方法运行情况进行录制;

  4. 录制命中条件:一期尽量简化录制条件避免无冗余重复录制,具体设计为:设置录制命中入口函数,启动录制后,代码执行第一次到达入口函数即为命中,当前线程即进入录制状态,录制并保存该线程的运行时快照信息,当前线程从入口函数返回即为录制结束;

  5. 行录制优化:尽量减少无效的行录制(仅对发生赋值操作或发生函数调用后的行进行录制);

  6. 快照数据优化:仅对类对象中 get 方法和 public 属性序列化生成快照;

  7. 录制过程异步化:录制过程中代码增强与反增强过程、快照数据持久化、录制组件初始化与清理等都采用异步化实现。

三、IDEA 插件介绍

3.1 插件界面展示及功能介绍


插件目前支持的功能包括:


  • 权限管理:通过手机号和 token 进行验权;

  • 有赞云远程调试启动器:打开有赞云应用代码,配置入口类和入口方法,开始调试,然后出发接口调用,录制结束后自动跳到入口类和方法的第一行,然后就可以进行无阻塞的快照形式的调试,一次录制多次调试;

3.2 插件运行流程

3.3 构建文件索引


目前索引内容是用内存实现的,未来会支持本地文件检索。下面简单介绍下这样设计的原因:


  • 调试步骤包括 resume、stepOver、stepInto、stepOut、点击调用栈跳转,需要根据每种步骤计算出对应的行快照信息并展示;

  • 方法信息:计算出对应行快照信息之后获取方法的相关信息展示到调试栏;

  • 类对应的行快照:用来在点击调用栈跳转时根据类名和行号定位行快照的;

  • 方法调用对应行快照:用来 stepOver 时快速找到下一行使用;

  • 所有行快照:用来 stepInto 快速定位下一个录制行快照使用;

  • pos:记录当前正在调试的位置;

四、应用方法执行录制

应用方法执行录制是基于阿里开源的 jvm-sandbox 进行定制后实现的,主要做的事情包括:


  • 增强了 jvm-sandbox 的内核,支持行调用通知获取局部变量;

  • 增加了 sandbox 录制的插件,用来监听事件来进行数据处理和持久化;

4.1 Jvm-sandbox 内核增强


上面是代码增强逻辑的伪代码呈现,上面例子中真实增强的代码实际反汇编后如下:



与开源版本的区别



扩展内容:


  1. Spy.spyMethodOnCallBeforeExt,Spy.spyMethodOnCallReturnExt,Spy.spyMethodOnCallThrowsExt 扩展了参数列表,用来未来扩展

  2. Spy.spyMethodOnLineExt:行调用前通知,用来录制当前对象和方法参数和本地变量(本次主要使用的扩展)

4.2 沙箱录制模块加载过程

4.3 局部变量表分析

在进行字节码增强之前会通过 ClassMetaVisitor 先进行一次字节码分析拿到局部变量表。流程如下:



  • appendLabel:记录 label 信息;

  • appendLineNumber:记录行号信息,并记录行号和 label 对应关系;

  • appendLocalVariable:记录局部变量信息和对应的开始和结束的 label

  • updateLocalVariableLine:根据开始结束的 label 计算本地变量的作用的行号范围,一般情况下查找行号的规则是计算当前 label 的行号信息,当前 label 没有行号信息时开始 label 向后找,结束 label 向前找

  • updateLocalVariableScope:优化局部变量表的有效范围,防止局部变量表有复用的情况时存在两个复用的局部变量存在有效行区间存在覆盖的情况

  • registerMethodMeta:存储分析好的局部变量表

4.4 录制过程解析(以行录制为例)


  • beforeLineExt:获取到计算后的局部变量表,然后获取对应变量值并持久化

4.5 录制数据模型

五、沙箱环境管理


上图简述了沙箱的安装和卸载的管理过程;其中 record-server 不能直接和有赞云应用容器交互,必须通过 ops 中转;

六、未来规划

  1. 丰富各种录制场景应对复杂问题调试;

  2. 提高录制性能;目前在开启录制之后代码运行速度很慢,可能会造成接口调用超时

  3. 远程调试+热部署,边开发边调试更加极致的开发体验(DCEVM + HotSwapAgent );


本文转载自公众号有赞 coder(ID:youzan_coder)。


原文链接


https://mp.weixin.qq.com/s/EGyM88I22HLbIOCDVGvxHA


2020-02-25 10:132031

评论

发布
暂无评论
发现更多内容

百度商业AI技术创新大赛区域赛落幕,各大高校科技新秀角逐复赛

百度Geek说

人工智能 百度 AIGC 企业号 7 月 PK 榜

TE智库 |《中国通用大模型内容生成及安全性能力评测》报告发布,深度测评中国大模型玩家

TE智库

创业大赛|第二届“金靴奔跑”创新创业大赛!

科兴未来News

大数据实时链路备战——数据双流高保真压测 | 京东云技术团队

京东科技开发者

大数据 压测 企业号 7 月 PK 榜 双流 数据双流

Java的异常处理

java易二三

异常处理 java 编程 #编程

保护 TDengine 查询性能——3.0 如何大幅降低乱序数据干扰?

爱倒腾的程序员

数据库

如何更快地渲染?深入了解3D渲染性能的指南

Finovy Cloud

中企出海,数智人力构建全球化组织的驱动力!

用友BIP

中企出海 数智人力

【MySQL技术专题】「问题实战系列」深入探索和分析MySQL数据库的数据备份和恢复实战开发指南(备份+恢复篇)

码界西柚

MySQL 数据恢复 数据备份 技术分析

结合线上线下环境,提供产品的服务...

Bonaparte

产品 产品经理 产品设计 产品思维 产品服务

Python案例实现|租房网站数据表的处理与分析

TiAmo

Python 数据分析 爬虫

高性能网络 SIG 月度动态:再获认可!3 位成员成为 Linux 内核社区 reviewer

OpenAnolis小助手

Linux 内核 高性能网络 龙蜥sig smc

点云标注在自动驾驶中的优化策略

数据堂

提升直播软件源码开发平台性能关键利器功能_山东布谷科技创作

山东布谷科技

源码 软件 软件开发 直播 源码搭建

深入探析数智时代下的分布式系统架构设计

不在线第一只蜗牛

AI 低代码 分布式架构 数智时代

点云标注在自动驾驶中的难点

数据堂

【专业 TypeScript 实战】15 个高级技巧,开创卓越开发之路!

汽车之家客户端前端团队

云环境与服务器的四大区别简单聊聊

行云管家

云计算 云服务器 云环境

拆解雪花算法生成规则 | 京东物流技术团队

京东科技开发者

算法 雪花算法 企业号 7 月 PK 榜

粗粮细作,铁合金行业的节能降耗

用友BIP

冶金

频繁FullGC的原因竟然是“开源代码”? | 京东云技术团队

京东科技开发者

JVM GC 企业号 7 月 PK 榜 Full GC

GitHub上有哪些好项目?GeaFlow图计算快速上手之SSSP算法

TuGraphAnalytics

图算法 图论 GeaFlow tugraph 单源最短路径

深耕零售行业数字化,乐檬软件与华为云携手共进

华为云开发者联盟

云计算 后端 华为云 华为云开发者联盟 企业号 7 月 PK 榜

Java框架——SSM框架增删改查

java易二三

SSM框架 java 编程

告别传统人肉运维,实现360°可观测!奇点云数据存算引擎DataKun R2.0发布

极客天地

大型企业采购云管平台的需求是什么?选择哪家厂商好?

行云管家

云计算 企业上云 云管平台

AI驱动税务智能,开启智慧税务新纪元

用友BIP

AI 税务管理

antv-x6使用及总结 | 京东物流技术团队

京东科技开发者

数据可视化 可视化开发 企业号 7 月 PK 榜 antv-x6

有赞云应用远程调试工具_容器_王许川_InfoQ精选文章