0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

什么是DAP协议?DAP如何工作?详解deepin-IDE中的调试功能

OSC开源社区 来源:OSCHINA 社区 2023-11-10 16:46 次阅读

作者:deepin-mozart、toberyan


前不久深度科技旗下 deepin 社区发布了自己的 IDE:deepin-IDE,得到了全网用户尤其是开源社区用户的广泛关注,目前在 GitHub仓库的 star 数量已经达到 600 多个,说明大家的热情还是很高涨的。

为了从技术层面给大家的热情做一个反馈,本文试着将 deepin-IDE 内部的一些实现方法进行分享,希望能够解答友友们的疑惑并得到积极的反馈。

本篇挑了大家关心的 “调试” 部分进行分享。需要说明的是,deepin-IDE 的调试功能是选用 DAP(Debug Adapter Protocol )调试适配协议实现的,所以整体架构是围绕该协议搭建的,至于DAP具体是什么,让我们带着问号往下看。

什么是DAP协议

DAP即调试适配协议 (Debug Adapter Protocol),顾名思义,它是用来对多种调试器进行抽象统一的适配层,将原有IDE和调试工具直接交互的模式更改为和DAP进行交互。该模式可以让IDE集成多种调试器变得更简单,且灵活性更好。

在IDE中的调试功能有许多小功能组成,包括单步执行、断点、查看变量值等,常规的实现方式是在每个IDE中去实现这些逻辑,且因为调试工具的接口不同,还需要为每个调试工具做一些适配工作,这将导致大量且重复的工作,如下图所示:

6ee9c6c8-7eef-11ee-939d-92fbcf53809c.png




调试适配器协议背后的想法是标准化一个抽象协议,用于开发工具如何与具体调试器通信。这个思想和LSP(Language Server Protocol) 和BSP(Build Server Protocol) 类似,都是通过协议去统一相同功能在不同工具之间的差异性。其所处位置如下图所示,其中左边为不同的开发工具,右边为不能同的调试器,不同于开发工具和调试器直接交互的方式,DAP将这些交互统一了起来,让开发工具和调试工具都面向DAP编程

上图中的交互是通过协议进行,所以不会像通过API的方式存在语言限制,可以更好的适应调试器的集成。

DAP 如何工作

以下部分解释了开发工具(例如IDE或编辑器)和调试适配器之间的交互,包括具体的协议格式说明、交互流程等。

调试会话

开发工具有两种基础的方式和调试器进行交互,分别是:

【单会话模式】 在这种模式下,开发工具启动一个调试适配器作为一个单独的进程并且通过标准的 std 接口进行通信。在调试会话的结束时调试适配器就终止,对于当前的调试会话,开发工具往往需要实现多个调试适配。

【多会话模式】

在这种模式下,开发工具不会启动调试适配器,而是假定它已经在运行并且会在特定端口上侦听连接尝试,对于每个调试会话,开发工具在特定端口上启动一个新的通信会话并在会话结束时断开连接。

在与调试适配器建立连接后,开发工具和调试适配器之间通过基础协议进行通信。

基础协议

基础协议由两部分组成,包括头和内容 (类似于 HTTP),头部和内容部分通过 “ ” 进行分割:
【协议头】


协议头部分由字段组成, 每个头字段由一个键和一个值组成,用‘:’(一个冒号和一个空格)分隔, 每个头字段都以 “ “结尾。由于最后一个协议头字段和整个协议头本身都以 终止,并且由于协议头是强制性的,所以消息的内容部分总是在(并唯一标识)两个 序列之前。当前只支持一个协议头字段:

Content-Length 数字 这个字段是必须的,用来记录内容字段的长度,单位是字节。
头字段名 值类型 描述


协议头部分使用的是 “ASCII” 编码。

【内容部分】

内容部分包含了实际要传输的数据,这些数据用JSON格式来描述请求、响应和事件。内容部分用的是utf-8编码

为了有个具体的认识,这里举个简单的例子。在调试过程中,开发人员经常会使用到下一步操作,在DAP中其协议为:

Content-Length: 119



{
  "seq": 153,
  "type": "request",
  "command": "next",
  "arguments": {
    "threadId": 3
   }
}
类型是 “请求”,命令是下一步,参数部分可以携带多个,这里是用的线程 Id。这个协议看着挺简单的,是吧?接下来就讲讲如何使用它。


使用方法


详细的使用方法这里就不涉及,因为用一个时序图就可以说明:

6f01278c-7eef-11ee-939d-92fbcf53809c.png


可以看到,初始化、请求、响应等必要的步骤都在图中。其中调试适配器可以理解为调试器的抽象,调试功能的最终执行者是由对应语言的调试工具实现的。



在 deepin-IDE 中的实现


在 deepin-IDE 中,调试功能的实现是结合cppdap+debugmanager实现的。

cppdap是一款基于 C++ 开发的SDK,基本实现了DAP的全量协议。deepin-IDE 的客户端和服务端都是应用的该SDK进行开发,据此可以实现以下功能:

1. 通信功能,包括服务端的 TCP 监听,客户端的 TCP 连接等;

2.DAP协议的封装,并实现协议的串行化和解串行化;

3. 提供注册回调功能,从而可以在回调内处理各种事件、请求等;

它的层级结构如下:

6f1393c2-7eef-11ee-939d-92fbcf53809c.png


用cppdap可以减少客户端和服务端不少工作量,也统一了两边的协议数据。而 debugmanager 可以理解为调试器的抽象,包含所有必要的调试要素。整体结构如下:

6f266f4c-7eef-11ee-939d-92fbcf53809c.png


左边是客户端,右边是服务端,内部实现如下:


客户端实现


客户端包含了两个个主要功能,一个是和DAP服务端进行交互,发送调试命令或处理返回的数据;另一个是将DAP数据转换后显示到用户界面,并响应界面发送的事件。概括起来就包含业务模块、事件模块、DAP模块和界面 4 个部分。
业务模块


业务模块包含了插件类、调试参数、调试管理类等,其中插件类负责插件加载、初始化、获取上下文等,调试管理类用来组合事件、DAP、界面几个模块。事件模块

事件模块包含两个子模块,分别是事件发送和事件接收,比如页面跳转事件、添加 移除断点事件等。DAP模块


DAP模块基于cppdap开发,采用层级结构,底层是原始DAP协议封装,中间层是针对业务做的进一步封装,简化了向外提供的接口,最上层是对整个调试功能的整合,包括数据缓存、界面元素、命令收发。

6f469d76-7eef-11ee-939d-92fbcf53809c.png


界面部分 界面模块包含堆栈界面、变量界面、断点列表、异步对话框等,用于DAP的数据展示。

6f546514-7eef-11ee-939d-92fbcf53809c.png


如上图所示,灰色部分为DAP客户端的界面呈现。


服务端实现



服务端的功能分为两个部分,一个是基于cppdap实现命令的收发,另一个是与gdb交互,实现调试程序的启动、暂停、退出等一系列动作。
DAP


和客户端一样,服务端也是基于cppdap实现的通信和协议封装和解析。调试工具


和调试工具的交互是通过进程调用的方式实现,接收进程输出得到返回信息。如果调试工具本身支持DAP协议,则可以直接交互。


至此,本次的分享就到这儿啦!不知道你对deepin-IDE中的调试功能有所了解了吗?

温馨提示,deepin-IDE 还包含很多有意思的功能,如果大家感兴趣可以积极反馈,后续有机会再进行分享。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 适配器
    +关注

    关注

    8

    文章

    1823

    浏览量

    66942
  • IDE
    IDE
    +关注

    关注

    0

    文章

    326

    浏览量

    46338
  • 调试技术
    +关注

    关注

    0

    文章

    7

    浏览量

    6588
  • GitHub
    +关注

    关注

    3

    文章

    457

    浏览量

    15924

原文标题:解密deepin-IDE:如何实现简单灵活的调试技术?

文章出处:【微信号:OSC开源社区,微信公众号:OSC开源社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    如何通过DAP协议访问内部存储器?

    我想使用 DAP 协议对 TC38x 系列 MCU 的 pFlash/DFlash 进行编程。 是否有任何记录了 DAP 协议详细信息的相关文档? 如何通过
    发表于 01-23 07:51

    使用带有DAP miniwiggler硬件的memtool进行闪存,如何使用memtool进行调试

    我正在尝试使用带有 DAP miniwiggler 硬件的 memtool 进行闪存。 但是我不知道如何调试它。 另外,如果它们有任何设置可以将程序计数器设置为我们的应用程序内存地址,那将非常有帮助。 如何使用memtool进行调试
    发表于 01-23 06:37

    【仿真器,不只有J—Link】CMSIS-DAP调试标准解读

    得到了openOCD和pyOCD的支持,同样可以实现jlink上位机的功能。使用u*** hid协议,向下对于调试器的实现来说降低了复杂度,向上对于IDE的集成带来的好处则是免驱动,方
    发表于 04-05 10:35

    怎样去使用CMSIS_DAP调试器呢

    关于STM32调试器CMSIS_DAP的使用及注意事项说明最近在做了一个DAP调试器,完全开源的方案,大部分代码都是由STM32CUBEMX生成的,使用的STM32CubeIDE作为开
    发表于 03-01 06:15

    RTT Studio什么时候可以实现DAP下载调试呢?

    RTT Studio什么时候可以实现DAP下载调试呢?手上只有一个DAP的仿真器,大概什么时候能用上呀?多谢。。。。。
    发表于 05-11 09:47

    为什么无法在MCUXpresso IDE为导入的cmake项目设置LinkServer (CMSIS-DAP)调试

    你好!我无法在 MCUXpresso IDE 为导入的 cmake 项目设置 LinkServer (CMSIS-DAP) 调试。是否可以?我找不到任何解决方案。 细节: 我创建了简
    发表于 05-29 08:01

    CoreSight DAP相关资料

    本指南的目的是让您更好地了解: ·什么是CoreSight调试访问端口(DAP)及其工作原理。 ·什么是接入端口(AP)及其工作原理。 ·什么是ROM表,以及它是如何实现的。 ·使用A
    发表于 08-25 07:54

    GD32_CMSIS_DAP

    GD32_CMSIS_DAP,有需要的下来看看
    发表于 07-29 17:08 99次下载

    基于OpenOCD和DAP的嵌入式远程调试系统研究与设计

    统通过OpenOCD向目标芯片发送调试命令,经过JTAG仿真器传给目标芯片的JTACJ接口,并通过DAP生成总线事务完成调试操作。经实际应用表明,该系统支持插入断点、单步执行、读写寄存器和存储空间等
    发表于 11-23 16:15 2次下载
    基于OpenOCD和<b class='flag-5'>DAP</b>的嵌入式远程<b class='flag-5'>调试</b>系统研究与设计

    DAP022芯片手册

    DAP022是一个高度集成的PWM控制器。它内置了几个功能来增强sot - 26中脱机电源的性能包中。在轻载状态下,DAP022自动折叠操作频率t0 26KHz存档最佳效率。在任何负载条件,控制器
    发表于 01-02 15:27 42次下载
    <b class='flag-5'>DAP</b>022芯片手册

    介绍DAP Miniwiggler的安装使用

    DAP Miniwiggler在DAVE3和Memtool中的使用
    的头像 发表于 07-11 01:21 1.1w次阅读

    逐飞K66核心板+逐飞DAP下载器调试方式及接线(SWD)

    以逐飞K66例程的LED Blink为例,环境是IAR。接线方式为SWD。和逐飞DAP教程一样,看到侧边窗口,在工程名上右键,选择Options,在左侧菜单选中Debugger,右边Driver选择
    发表于 12-03 12:51 15次下载
    逐飞K66核心板+逐飞<b class='flag-5'>DAP</b>下载器<b class='flag-5'>调试</b>方式及接线(SWD)

    完全兼容CMSIS DAP调试适配器的IBDAP

    电子发烧友网站提供《完全兼容CMSIS DAP调试适配器的IBDAP.zip》资料免费下载
    发表于 11-21 11:01 1次下载
    完全兼容CMSIS <b class='flag-5'>DAP</b>的<b class='flag-5'>调试</b>适配器的IBDAP

    好多人问,必须正式介绍一下:deepin-IDE

    deepin-IDE 并不是突然冒出来的,在内部已经开发了多年时间,为什么一直都默默无闻呢?因为这期间都在不断完善特色功能,并攻克一些技术难题,还没有达到非常完善的地步。同时因为设计人员没有参与
    的头像 发表于 09-04 16:34 473次阅读
    好多人问,必须正式介绍一下:<b class='flag-5'>deepin-IDE</b>

    deepin-IDE旧貌换新颜:从Qt到DTK

    deepin-IDEDeepin Union Code)新版本现已推出,具体更新内容如下
    的头像 发表于 12-28 09:45 402次阅读
    <b class='flag-5'>deepin-IDE</b>旧貌换新颜:从Qt到DTK