【AICon】AI 基础设施、LLM运维、大模型训练与推理,一场会议,全方位涵盖! >>> 了解详情
写点什么

有赞云应用远程调试工具

  • 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


公众号推荐:

跳进 AI 的奇妙世界,一起探索未来工作的新风貌!想要深入了解 AI 如何成为产业创新的新引擎?好奇哪些城市正成为 AI 人才的新磁场?《中国生成式 AI 开发者洞察 2024》由 InfoQ 研究中心精心打造,为你深度解锁生成式 AI 领域的最新开发者动态。无论你是资深研发者,还是对生成式 AI 充满好奇的新手,这份报告都是你不可错过的知识宝典。欢迎大家扫码关注「AI前线」公众号,回复「开发者洞察」领取。

2020-02-25 10:131548

评论

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

以搭建Vuepress文档为例,展示用VSCode来远程开发

为自己带盐

vscode 1月月更 远程开发

如何利用Spot,成本与稳定同时兼得

jinjin

spot 热池 spotmax

常用开源监控系统分析推荐(必备知识)|附优质监控书籍资源

云智慧AIOps社区

安全 监控宝 监控工具 开源软件 运维管理

26个主流机器学习算法的实现,获4万好评,这本机器学习宝典终于来了!

图灵教育

机器学习 代码 公式

如何用建木CI构建/发布建木Hub节点定义版本

Jianmu

DevOps CI/CD 开源项目 发送邮件 检查系统服务

LabVIEW感兴趣区域分析(实战篇—1)

不脱发的程序猿

机器视觉 图像处理 LabVIEW 感兴趣区域分析 ROI

优化服务器存储架构——Amazon EBS io2 Block Express正式推出!

亚马逊云科技 (Amazon Web Services)

存储

【网络安全】红蓝攻防:shellcode的分析

H

网络安全 WEB安全

龙蜥的朋友圈又大了!知名数据库产品服务商南大通用加入社区

OpenAnolis小助手

开源 社群

敏捷真的是开发者的绊脚石吗?

LigaAI

敏捷开发

SphereEx 创始人张亮荣获『2021 年度海纳奖——分布式数据库十佳实践人物』

SphereEx

数据库 开源 ShardingSphere SphereEx 海纳奖

【量化】量化交易入门系列4:经典的量化交易策略(下)

恒生LIGHT云社区

量化策略 量化投资 量化交易 量化

浅谈云上攻防——云服务器攻防矩阵

腾讯安全云鼎实验室

云原生 云上安全攻防

青藤:业务迁移到容器云上的6个注意事项

青藤云安全

C++太难学,怎么破?这本书给你指点迷津!

图灵教育

c++ 编程 入门

在Amazon SageMaker中灵活使用多种存储服务

亚马逊云科技 (Amazon Web Services)

存储

知乎基于Palo的用户画像和实时数仓构建实践

百度开发者中心

大数据

使用 esbuild 来打包一个 React 库

CRMEB

使用 Amazon Redshift ML 构建多分类模型

亚马逊云科技 (Amazon Web Services)

存储

云原生训练营毕业总结

白开水又一杯

云原生

Redis 使用 List 实现消息队列有哪些利弊?

码哥字节

redis 消息队列 Redis 6.0 1月月更

通用数据保护条例的监管下,你的数据湖“断舍离”了吗?

亚马逊云科技 (Amazon Web Services)

存储

美容院CRM系统解决方案

低代码小观

CRM 客户关系管理 CRM系统 客户关系管理系统 企业管理工具

活动预告 | OpenMLDB Meetup No.1

第四范式开发者社区

人工智能 机器学习 开源

Office2021 和Microsoft 365分不清?这样选最划算

淋雨

Office 365

手淘 Android 帧率采集与监控详解

阿里巴巴终端技术

android 性能优化 移动开发 客户端

workflow 之 Luigi 3.x 基本用法(qbit)

qbit

工作流 pipeline workflow 数据流

Amazon SageMaker Data Wrangler 简化数据准备过程,助力机器学习

亚马逊云科技 (Amazon Web Services)

存储

不听话的 Container

百瓶技术

flutter 布局与组件

应用营销策略知多少?

坚果

产品设计 1月月更

VuePress 博客优化之添加数据统计功能

冴羽

JavaScript Vue 前端 博客 vuepress

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