作者:deepin-mozart、toberyan
前不久深度科技旗下 deepin 社區(qū)發(fā)布了自己的 IDE:deepin-IDE,得到了全網(wǎng)用戶尤其是開源社區(qū)用戶的廣泛關(guān)注,目前在 GitHub倉庫的 star 數(shù)量已經(jīng)達到 600 多個,說明大家的熱情還是很高漲的。
為了從技術(shù)層面給大家的熱情做一個反饋,本文試著將 deepin-IDE 內(nèi)部的一些實現(xiàn)方法進行分享,希望能夠解答友友們的疑惑并得到積極的反饋。
本篇挑了大家關(guān)心的 “調(diào)試” 部分進行分享。需要說明的是,deepin-IDE 的調(diào)試功能是選用 DAP(Debug Adapter Protocol )調(diào)試適配協(xié)議實現(xiàn)的,所以整體架構(gòu)是圍繞該協(xié)議搭建的,至于DAP具體是什么,讓我們帶著問號往下看。
什么是DAP協(xié)議
DAP即調(diào)試適配協(xié)議 (Debug Adapter Protocol),顧名思義,它是用來對多種調(diào)試器進行抽象統(tǒng)一的適配層,將原有IDE和調(diào)試工具直接交互的模式更改為和DAP進行交互。該模式可以讓IDE集成多種調(diào)試器變得更簡單,且靈活性更好。
在IDE中的調(diào)試功能有許多小功能組成,包括單步執(zhí)行、斷點、查看變量值等,常規(guī)的實現(xiàn)方式是在每個IDE中去實現(xiàn)這些邏輯,且因為調(diào)試工具的接口不同,還需要為每個調(diào)試工具做一些適配工作,這將導(dǎo)致大量且重復(fù)的工作,如下圖所示:
調(diào)試適配器協(xié)議背后的想法是標(biāo)準(zhǔn)化一個抽象協(xié)議,用于開發(fā)工具如何與具體調(diào)試器通信。這個思想和LSP(Language Server Protocol) 和BSP(Build Server Protocol) 類似,都是通過協(xié)議去統(tǒng)一相同功能在不同工具之間的差異性。其所處位置如下圖所示,其中左邊為不同的開發(fā)工具,右邊為不能同的調(diào)試器,不同于開發(fā)工具和調(diào)試器直接交互的方式,DAP將這些交互統(tǒng)一了起來,讓開發(fā)工具和調(diào)試工具都面向DAP編程。
上圖中的交互是通過協(xié)議進行,所以不會像通過API的方式存在語言限制,可以更好的適應(yīng)調(diào)試器的集成。
DAP 如何工作
以下部分解釋了開發(fā)工具(例如IDE或編輯器)和調(diào)試適配器之間的交互,包括具體的協(xié)議格式說明、交互流程等。
調(diào)試會話
開發(fā)工具有兩種基礎(chǔ)的方式和調(diào)試器進行交互,分別是:
【單會話模式】 在這種模式下,開發(fā)工具啟動一個調(diào)試適配器作為一個單獨的進程并且通過標(biāo)準(zhǔn)的 std 接口進行通信。在調(diào)試會話的結(jié)束時調(diào)試適配器就終止,對于當(dāng)前的調(diào)試會話,開發(fā)工具往往需要實現(xiàn)多個調(diào)試適配。
【多會話模式】
在這種模式下,開發(fā)工具不會啟動調(diào)試適配器,而是假定它已經(jīng)在運行并且會在特定端口上偵聽連接嘗試,對于每個調(diào)試會話,開發(fā)工具在特定端口上啟動一個新的通信會話并在會話結(jié)束時斷開連接。
在與調(diào)試適配器建立連接后,開發(fā)工具和調(diào)試適配器之間通過基礎(chǔ)協(xié)議進行通信。
基礎(chǔ)協(xié)議
基礎(chǔ)協(xié)議由兩部分組成,包括頭和內(nèi)容 (類似于 HTTP),頭部和內(nèi)容部分通過 “ ” 進行分割:
【協(xié)議頭】
協(xié)議頭部分由字段組成, 每個頭字段由一個鍵和一個值組成,用‘:’(一個冒號和一個空格)分隔, 每個頭字段都以 “ “結(jié)尾。由于最后一個協(xié)議頭字段和整個協(xié)議頭本身都以 終止,并且由于協(xié)議頭是強制性的,所以消息的內(nèi)容部分總是在(并唯一標(biāo)識)兩個 序列之前。當(dāng)前只支持一個協(xié)議頭字段:
Content-Length | 數(shù)字 | 這個字段是必須的,用來記錄內(nèi)容字段的長度,單位是字節(jié)。 |
頭字段名 | 值類型 | 描述 |
---|
協(xié)議頭部分使用的是 “ASCII” 編碼。
【內(nèi)容部分】
內(nèi)容部分包含了實際要傳輸?shù)臄?shù)據(jù),這些數(shù)據(jù)用JSON格式來描述請求、響應(yīng)和事件。內(nèi)容部分用的是utf-8編碼
為了有個具體的認(rèn)識,這里舉個簡單的例子。在調(diào)試過程中,開發(fā)人員經(jīng)常會使用到下一步操作,在DAP中其協(xié)議為:
Content-Length: 119 { "seq": 153, "type": "request", "command": "next", "arguments": { "threadId": 3 } }類型是 “請求”,命令是下一步,參數(shù)部分可以攜帶多個,這里是用的線程 Id。這個協(xié)議看著挺簡單的,是吧?接下來就講講如何使用它。
使用方法
詳細(xì)的使用方法這里就不涉及,因為用一個時序圖就可以說明:
可以看到,初始化、請求、響應(yīng)等必要的步驟都在圖中。其中調(diào)試適配器可以理解為調(diào)試器的抽象,調(diào)試功能的最終執(zhí)行者是由對應(yīng)語言的調(diào)試工具實現(xiàn)的。
在 deepin-IDE 中的實現(xiàn)
在 deepin-IDE 中,調(diào)試功能的實現(xiàn)是結(jié)合cppdap+debugmanager實現(xiàn)的。
cppdap是一款基于 C++ 開發(fā)的SDK,基本實現(xiàn)了DAP的全量協(xié)議。deepin-IDE 的客戶端和服務(wù)端都是應(yīng)用的該SDK進行開發(fā),據(jù)此可以實現(xiàn)以下功能:
1. 通信功能,包括服務(wù)端的 TCP 監(jiān)聽,客戶端的 TCP 連接等;
2.DAP協(xié)議的封裝,并實現(xiàn)協(xié)議的串行化和解串行化;
3. 提供注冊回調(diào)功能,從而可以在回調(diào)內(nèi)處理各種事件、請求等;
它的層級結(jié)構(gòu)如下:
用cppdap可以減少客戶端和服務(wù)端不少工作量,也統(tǒng)一了兩邊的協(xié)議數(shù)據(jù)。而 debugmanager 可以理解為調(diào)試器的抽象,包含所有必要的調(diào)試要素。整體結(jié)構(gòu)如下:
左邊是客戶端,右邊是服務(wù)端,內(nèi)部實現(xiàn)如下:
客戶端實現(xiàn)
客戶端包含了兩個個主要功能,一個是和DAP服務(wù)端進行交互,發(fā)送調(diào)試命令或處理返回的數(shù)據(jù);另一個是將DAP數(shù)據(jù)轉(zhuǎn)換后顯示到用戶界面,并響應(yīng)界面發(fā)送的事件。概括起來就包含業(yè)務(wù)模塊、事件模塊、DAP模塊和界面 4 個部分。
業(yè)務(wù)模塊
業(yè)務(wù)模塊包含了插件類、調(diào)試參數(shù)、調(diào)試管理類等,其中插件類負(fù)責(zé)插件加載、初始化、獲取上下文等,調(diào)試管理類用來組合事件、DAP、界面幾個模塊。事件模塊
事件模塊包含兩個子模塊,分別是事件發(fā)送和事件接收,比如頁面跳轉(zhuǎn)事件、添加 移除斷點事件等。DAP模塊
DAP模塊基于cppdap開發(fā),采用層級結(jié)構(gòu),底層是原始DAP協(xié)議封裝,中間層是針對業(yè)務(wù)做的進一步封裝,簡化了向外提供的接口,最上層是對整個調(diào)試功能的整合,包括數(shù)據(jù)緩存、界面元素、命令收發(fā)。
界面部分 界面模塊包含堆棧界面、變量界面、斷點列表、異步對話框等,用于DAP的數(shù)據(jù)展示。
如上圖所示,灰色部分為DAP客戶端的界面呈現(xiàn)。
服務(wù)端實現(xiàn)
服務(wù)端的功能分為兩個部分,一個是基于cppdap實現(xiàn)命令的收發(fā),另一個是與gdb交互,實現(xiàn)調(diào)試程序的啟動、暫停、退出等一系列動作。
DAP
和客戶端一樣,服務(wù)端也是基于cppdap實現(xiàn)的通信和協(xié)議封裝和解析。調(diào)試工具
和調(diào)試工具的交互是通過進程調(diào)用的方式實現(xiàn),接收進程輸出得到返回信息。如果調(diào)試工具本身支持DAP協(xié)議,則可以直接交互。
至此,本次的分享就到這兒啦!不知道你對deepin-IDE中的調(diào)試功能有所了解了嗎?
溫馨提示,deepin-IDE 還包含很多有意思的功能,如果大家感興趣可以積極反饋,后續(xù)有機會再進行分享。
審核編輯:湯梓紅
-
適配器
+關(guān)注
關(guān)注
8文章
1914瀏覽量
67850 -
IDE
+關(guān)注
關(guān)注
0文章
334瀏覽量
46614 -
調(diào)試技術(shù)
+關(guān)注
關(guān)注
0文章
7瀏覽量
6614 -
GitHub
+關(guān)注
關(guān)注
3文章
465瀏覽量
16359
原文標(biāo)題:解密deepin-IDE:如何實現(xiàn)簡單靈活的調(diào)試技術(shù)?
文章出處:【微信號:OSC開源社區(qū),微信公眾號:OSC開源社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論