解密deepin-IDE:如何实现简单灵活的调试技术?
作者:deepin-mozart、toberyan
链接:https://www.oschina.net/news/265585/deepin-ide-debug
DAP
具体是什么,让我们带着问号往下看。什么是 DAP
协议
DAP
即调试适配协议 (Debug Adapter Protocol),顾名思义,它是用来对多种调试器进行抽象统一的适配层,将原有 IDE
和调试工具直接交互的模式更改为和 DAP
进行交互。该模式可以让 IDE
集成多种调试器变得更简单,且灵活性更好。IDE
中的调试功能有许多小功能组成,包括单步执行、断点、查看变量值等,常规的实现方式是在每个 IDE
中去实现这些逻辑,且因为调试工具的接口不同,还需要为每个调试工具做一些适配工作,这将导致大量且重复的工作,如下图所示:LSP
(Language Server Protocol) 和 BSP
(Build Server Protocol) 类似,都是通过协议去统一相同功能在不同工具之间的差异性。其所处位置如下图所示,其中左边为不同的开发工具,右边为不能同的调试器,不同于开发工具和调试器直接交互的方式,DAP
将这些交互统一了起来,让开发工具和调试工具都面向 DAP
编程。API
的方式存在语言限制,可以更好的适应调试器的集成。DAP 如何工作
IDE
或编辑器)和调试适配器之间的交互,包括具体的协议格式说明、交互流程等。调试会话
基础协议
头字段名 | 值类型 | 描述 |
---|---|---|
Content-Length | 数字 | 这个字段是必须的,用来记录内容字段的长度,单位是字节。 |
JSON
格式来描述请求、响应和事件。内容部分用的是 utf-8
编码DAP
中其协议为:Content-Length: 119\r\n
\r\n
{
"seq": 153,
"type": "request",
"command": "next",
"arguments": {
"threadId": 3
}
}
使用方法
在 deepin-IDE 中的实现
cppdap
+ debugmanager
实现的。cppdap
是一款基于 C++ 开发的 SDK
,基本实现了 DAP
的全量协议。deepin-IDE 的客户端和服务端都是应用的该 SDK
进行开发,据此可以实现以下功能:DAP
协议的封装,并实现协议的串行化和解串行化;cppdap
可以减少客户端和服务端不少工作量,也统一了两边的协议数据。而 debugmanager 可以理解为调试器的抽象,包含所有必要的调试要素。整体结构如下:客户端实现
DAP
服务端进行交互,发送调试命令或处理返回的数据;另一个是将 DAP
数据转换后显示到用户界面,并响应界面发送的事件。概括起来就包含业务模块、事件模块、DAP
模块和界面 4 个部分。业务模块包含了插件类、调试参数、调试管理类等,其中插件类负责插件加载、初始化、获取上下文等,调试管理类用来组合事件、
DAP
、界面几个模块。事件模块事件模块包含两个子模块,分别是事件发送和事件接收,比如页面跳转事件、添加 \ 移除断点事件等。
DAP
模块
DAP
模块基于 cppdap
开发,采用层级结构,底层是原始 DAP
协议封装,中间层是针对业务做的进一步封装,简化了向外提供的接口,最上层是对整个调试功能的整合,包括数据缓存、界面元素、命令收发。界面部分 界面模块包含堆栈界面、变量界面、断点列表、异步对话框等,用于
DAP
的数据展示。
如上图所示,灰色部分为
DAP
客户端的界面呈现。
服务端实现
cppdap
实现命令的收发,另一个是与 gdb
交互,实现调试程序的启动、暂停、退出等一系列动作。和客户端一样,服务端也是基于
cppdap
实现的通信和协议封装和解析。调试工具和调试工具的交互是通过进程调用的方式实现,接收进程输出得到返回信息。如果调试工具本身支持
DAP
协议,则可以直接交互。
deepin-IDE
中的调试功能有所了解了吗?参考文档
往期推荐
这里有最新开源资讯、软件更新、技术干货等内容
点这里 ↓↓↓ 记得 关注✔ 标星⭐ 哦
微信扫码关注该文公众号作者
戳这里提交新闻线索和高质量文章给我们。
来源: qq
点击查看作者最近其他文章