Golang /Go調(diào)試工具delve

原文地址:https://github.com/derekparker/delve/tree/master/Documentation

安裝

這里提供了支持的所有平臺(操作系統(tǒng))上安裝Delve的說明蛹屿。 請注意您必須安裝Go 1.5或更高版本逗扒。 此外如果使用Go 1.5慈省,您必須設(shè)置GO15VENDOREXPERIMENT = 1,然后再嘗試安裝前标。

  • OSX
在OSX上插入

請使用以下步驟在OSX上構(gòu)建和安裝Delve

Via Homebrew

如果你安裝了HomeBrew,只需運(yùn)行:

$ brew install go-delve/delve/delve

手動安裝

0) 必備條件
確保您具有正確的編譯工具鏈卖鲤。
這應(yīng)該是簡單的:

xcode-select --install

1)創(chuàng)建自簽名證書
你必須創(chuàng)建自簽名證書码耐,并使用它簽署二進(jìn)制文件:

  1. 打開應(yīng)用程序“鑰匙串訪問”(/ Applications / Utilities / Keychain Access.app)
  2. 打開菜單 /Keychain Access/Certificate Assistant/Create a Certificate...
  3. 選擇一個名稱(在示例中為dlv-cert),將“Identity Type(身份類型)”設(shè)置為“Self Signed Root(自簽名根)”檀夹,將“Certificate Type(證書類型)”設(shè)置為“Code Signing(代碼簽名)”筋粗,然后選擇“Let me override defaults(讓我覆蓋默認(rèn)值)”策橘。 單擊“Continue(繼續(xù))”。 您可能想將預(yù)定義的365天期間延長到3650天娜亿。
  4. 單擊“Continue(繼續(xù))”多次丽已,直到進(jìn)入“Specify a Location For The Certificate(指定證書的位置)”頁面,然后將“Keychain to System(鑰匙串設(shè)置為系統(tǒng))”买决。
  5. 如果您不能將證書存儲在“System(系統(tǒng))”鑰匙扣中沛婴,請在“l(fā)ogin(登錄)”鑰匙扣中創(chuàng)建,然后將其導(dǎo)出策州。 然后瘸味,您可以將其導(dǎo)入到“System(系統(tǒng))”鑰匙扣。
  6. 在鑰匙串中選擇“系統(tǒng)”够挂,你應(yīng)該找到你的新證書旁仿。 使用證書的上下文菜單(不是公鑰或私鑰),選擇“獲取信息”孽糖,打開“信任”項枯冈,并將“代碼簽名”設(shè)置為“始終信任”。
  7. [至少在Yosemite上:]在鑰匙串中選擇類別Keys - > dlv-cert - >右鍵單擊 - > GetInfo - >Access Control (訪問控制) - >選擇“允許所有應(yīng)用程序訪問此項目” - >保存更改办悟。
  8. 您必須退出“鑰匙串訪問”應(yīng)用程序尘奏,才能使用證書并通過終止當(dāng)前運(yùn)行的“任務(wù)門”進(jìn)程重新啟動“任務(wù)門”服務(wù)。 或者病蛉,您可以重新啟動計算機(jī)炫加。
    2)二進(jìn)制安裝
  9. 在寫go程序的時候首先創(chuàng)建文件夾$GOPATH/src/github.com/derekparker 并且cd 到c$GOPATH/src/github.com/derekparker目錄下
  10. clone 這個項目:git clone https://github.com/derekparker/delve.git 并且cd delve

注意:如果您使用Go 1.5必須先設(shè)置GO15VENDOREXPERIMENT = 1,然后才能繼續(xù)安裝铺然。
GO15VENDOREXPERIMENT env var只是選擇進(jìn)入Go 1.5 Vendor Experiment俗孝。(1.6不需要)

所有make命令都假設(shè)一個CERT環(huán)境變量,其中包含上面創(chuàng)建的證書的名稱魄健。 Makefile還假定GOPATH是單值的赋铝,不是冒號分隔的。 makefile只需要幫助促進(jìn)構(gòu)建和代碼簽名的過程沽瘦。

  • 運(yùn)行以下命令:CERT = dlv-cert make install革骨,它將安裝二進(jìn)制文件并對其進(jìn)行編碼。
    有關(guān)更多信息析恋,請參閱此安裝視頻https://www.youtube.com/watch?v=4ndjybtBg74
說明

在構(gòu)建期間取消代碼簽名授權(quán)提示
如果在使用自簽名證書運(yùn)行make時提示您授權(quán)良哲,請嘗試以下操作:

  • 打開應(yīng)用程序“鑰匙串訪問”(/ Applications / Utilities / Keychain Access.app)
  • 雙擊與您的自簽名證書(示例中的dlv-cert)對應(yīng)的私鑰
  • 選擇“Access Control(訪問控制)”選項卡
  • 單擊“始終允許這些應(yīng)用程序訪問”下的[+],然后從Finder對話框中選擇/ usr / bin / codesign
  • 點(diǎn)擊“(Save changes)保存更改”按鈕
  • 消除“Developer tools access(開發(fā)工具訪問)”提示運(yùn)行delve

如果運(yùn)行dlv時出現(xiàn)此提示:

"Developer tools access needs to take control of another process for debugging to continue. Type your password to allow this"

嘗試運(yùn)行DevToolsSecurity -enable以消除提示助隧。 有關(guān)更多信息臂外,請參閱man DevToolsSecurity。

  • Linux
    請使用以下步驟在Linux上構(gòu)建和安裝Delve
    在Linux上有兩種安裝方式。 首先是標(biāo)準(zhǔn)的go get方法:

go get github.com/derekparker/delve/cmd/dlv

或者漏健,您可以克隆repo并運(yùn)行:

$ make install

注意:如果您使用Go 1.5必須先設(shè)置GO15VENDOREXPERIMENT = 1嚎货,然后才能繼續(xù)安裝。 GO15VENDOREXPERIMENT env var只是選擇進(jìn)入Go 1.5 Vendor Experiment蔫浆。

  • Windows
    請使用標(biāo)準(zhǔn)的go get命令在Windows上構(gòu)建和安裝Delve

go get github.com/derekparker/delve/cmd/dlv

注意:如果您使用Go 1.5必須先設(shè)置GO15VENDOREXPERIMENT = 1殖属,然后才能繼續(xù)安裝。 GO15VENDOREXPERIMENT env var只是選擇進(jìn)入Go 1.5 Vendor Experiment瓦盛。

用法

您可以多種方式調(diào)用Delve洗显,具體取決于您的使用需求。 Delve使每個嘗試都是用戶友好的原环,確保用戶必須做最少的工作可能開始調(diào)試他們的程序挠唆。

請參閱主要使用文檔以進(jìn)一步探索命令。

命令行界面

命令

命令 描述
args 打印函數(shù)參數(shù)
break 設(shè)置一個斷點(diǎn)
breakpoints 打印激活的斷點(diǎn)信息
clear 刪除斷點(diǎn)
clearall 刪除所有的斷點(diǎn)
condition 設(shè)置斷點(diǎn)條件
continue 運(yùn)行到斷點(diǎn)或程序終止
disassemble 拆解器
exit 退出debugger
frame 在不同的框架上執(zhí)行的命令
funcs 打印函數(shù)列表
goroutine 顯示或更改當(dāng)前goroutine
goroutines 列出程序的全部goroutines
help 打印出幫助信息
list 顯示源代碼
locals 打印局部變量
next 跳到下一行
on 在遇到斷點(diǎn)時執(zhí)行一個命令
print 評估表達(dá)式
regs 打印CPU寄存器的內(nèi)容
restart 重啟進(jìn)程
set 更改變量的值
source 執(zhí)行包含delve命令列表的文件
sources 打印源文件列表
stack 打印堆棧跟蹤
step 單步執(zhí)行程序
step-instruction 單步單個執(zhí)行cpu指令
thread 切換到指定的線程
threads 打印每一個跟蹤線程的信息
trace 設(shè)置跟蹤點(diǎn)
types 打印類型列表
vars 打印某個包內(nèi)的(全局)變量

API

API文檔

Delve公開了主要可以與Delve編程交互的IDEs和編輯器的一個API接口,以便這些程序使用嘱吗。 API由終端使用玄组,因此無論新功能如何,都將始終保持最新的鎖定狀態(tài)谒麦。

使用

為了在“API模式”中運(yùn)行Delve俄讹,只需使用標(biāo)準(zhǔn)命令之一調(diào)用,提供--headless標(biāo)志绕德,如下所示:

$ dlv debug --headless --api-version=2 --log --listen=127.0.0.1:8181

這將以非交互模式啟動調(diào)試器患膛,偵聽指定的地址,并啟用日志記錄耻蛇。 當(dāng)然最后兩個標(biāo)志(log listen)是可選的踪蹬。
或者如果您要將多個客戶端連接到API,也可以指定--accept-multi客戶端標(biāo)志臣咖。
您可以使用connect子命令從Delve本身連接headless調(diào)試器:

$ dlv connect 127.0.0.1:8181

這對于遠(yuǎn)程調(diào)試很有用跃捣。

API 接口

Delve已經(jīng)可以允許多個客戶端/服務(wù)器這種方式的架構(gòu)亡哄。因?yàn)樗械摹皹I(yè)務(wù)邏輯”被抽象出實(shí)際的客戶端/服務(wù)器實(shí)現(xiàn)布疙,所有允許容易實(shí)現(xiàn)新的API接口。

當(dāng)前API接口

JSON-RPC

內(nèi)部文件

TODO(derek parker)

將要做的

這個目錄將包含調(diào)試器內(nèi)部和它如何工作的文檔截型。

編輯器集成

可以使用以下用于delve編輯器的插件:
1. Golang Plugin for IntelliJ IDEAhttps://github.com/go-lang-plugin-org/go-lang-idea-plugin
2. Go for Visual Studio Code (https://github.com/Microsoft/vscode-go#go-for-visual-studio-code)
3. Emacs plugin https://github.com/benma/go-dlv.el/
4. LiteIDE https://github.com/visualfc/liteide
5. Go Debugger for Atom
go-debug
atom 使用delve 來調(diào)試代碼

demo.gif

安裝
可以使用apm install go-debug或在設(shè)置中搜索go-debug宦焦。
安裝delve
查閱https://github.com/derekparker/delve/tree/master/Documentation/installation
綁定的快捷鍵

f5 運(yùn)行當(dāng)前包 (dlv debug)
ctrl-f5 測試運(yùn)行當(dāng)前包(dlv test)
shift-f5 重新啟動當(dāng)前的delve會話(r / restart)
f6 停止delve (exit / quit / q)
f8 繼續(xù)執(zhí)行 (c / continue)
f9 切換斷點(diǎn)
f10 到下一個斷電源(n / next)
f11 進(jìn)入函數(shù) (s / step)
cmd-k cmd-g (mac) / ctrl-k ctrl-g (others) 切換主面板

鏈接
關(guān)于slack的golang社區(qū):Gopher Slack| go-plus
問題波闹?請直接在go-plus頻道給我發(fā)送消息

已知bugs

  • 當(dāng)一個函數(shù)定義兩個(或多個)同名的變量時,delve無法區(qū)分它們:locals將打印這兩個變量孵淘,print將隨機(jī)選擇一個歹篓。 參見問題Issue#106庄撮。
  • Delve目前不支持32位系統(tǒng)。 這通常表現(xiàn)為proc / disasm.go中的編譯器錯誤毡庆。 參見問題Issue#20巡扇。
  • 當(dāng)Delve使用go之前的版本1.7.0編譯時,不能使用Receiver.Method Name語法在遠(yuǎn)程包中的函數(shù)上設(shè)置斷點(diǎn)厅翔。 參見問題Issue#528
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末熊泵,一起剝皮案震驚了整個濱河市甸昏,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌施蜜,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缸沃,死亡現(xiàn)場離奇詭異修械,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)翘单,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進(jìn)店門哄芜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人属提,你說我怎么就攤上這事美尸∈玻” “怎么了?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵蕊温,是天一觀的道長遏乔。 經(jīng)常有香客問我,道長凉翻,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任捻激,我火速辦了婚禮制轰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘垃杖。我一直安慰自己,他們只是感情好丈屹,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著旺垒,像睡著了一般彩库。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上袖牙,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天舅锄,我揣著相機(jī)與錄音鞭达,去河邊找鬼司忱。 笑死,一個胖子當(dāng)著我的面吹牛畴蹭,可吹牛的內(nèi)容都是我干的坦仍。 我是一名探鬼主播叨襟,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼繁扎,長吁一口氣:“原來是場噩夢啊……” “哼糊闽!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起提澎,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎掂墓,沒想到半個月后谦纱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡啦粹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年偿荷,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片唠椭。...
    茶點(diǎn)故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡跳纳,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出贪嫂,到底是詐尸還是另有隱情寺庄,我是刑警寧澤,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布力崇,位于F島的核電站斗塘,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏亮靴。R本人自食惡果不足惜馍盟,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望茧吊。 院中可真熱鬧贞岭,春花似錦八毯、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至芯侥,卻和暖如春泊交,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背柱查。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工廓俭, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人唉工。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓白指,卻偏偏與公主長得像,于是被迫代替她去往敵國和親酵紫。 傳聞我的和親對象是個殘疾皇子告嘲,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,500評論 2 359

推薦閱讀更多精彩內(nèi)容