原文地址:https://github.com/derekparker/delve/tree/master/Documentation
安裝
這里提供了支持的所有平臺(tái)(操作系統(tǒng))上安裝Delve的說明。 請(qǐng)注意您必須安裝Go 1.5或更高版本。 此外如果使用Go 1.5,您必須設(shè)置GO15VENDOREXPERIMENT = 1,然后再嘗試安裝。
- OSX
在OSX上插入
請(qǐng)使用以下步驟在OSX上構(gòu)建和安裝DelveVia Homebrew
如果你安裝了HomeBrew,只需運(yùn)行:$ brew install go-delve/delve/delve
手動(dòng)安裝
0) 必備條件
確保您具有正確的編譯工具鏈。
這應(yīng)該是簡(jiǎn)單的:
xcode-select --install
1)創(chuàng)建自簽名證書
你必須創(chuàng)建自簽名證書,并使用它簽署二進(jìn)制文件:
- 打開應(yīng)用程序“鑰匙串訪問”(/ Applications / Utilities / Keychain Access.app)
- 打開菜單 /Keychain Access/Certificate Assistant/Create a Certificate...
- 選擇一個(gè)名稱(在示例中為dlv-cert),將“Identity Type(身份類型)”設(shè)置為“Self Signed Root(自簽名根)”,將“Certificate Type(證書類型)”設(shè)置為“Code Signing(代碼簽名)”,然后選擇“Let me override defaults(讓我覆蓋默認(rèn)值)”。 單擊“Continue(繼續(xù))”。 您可能想將預(yù)定義的365天期間延長(zhǎng)到3650天。
- 單擊“Continue(繼續(xù))”多次,直到進(jìn)入“Specify a Location For The Certificate(指定證書的位置)”頁面,然后將“Keychain to System(鑰匙串設(shè)置為系統(tǒng))”。
- 如果您不能將證書存儲(chǔ)在“System(系統(tǒng))”鑰匙扣中,請(qǐng)?jiān)?#8220;login(登錄)”鑰匙扣中創(chuàng)建,然后將其導(dǎo)出。 然后,您可以將其導(dǎo)入到“System(系統(tǒng))”鑰匙扣。
- 在鑰匙串中選擇“系統(tǒng)”,你應(yīng)該找到你的新證書。 使用證書的上下文菜單(不是公鑰或私鑰),選擇“獲取信息”,打開“信任”項(xiàng),并將“代碼簽名”設(shè)置為“始終信任”。
- [至少在Yosemite上:]在鑰匙串中選擇類別Keys - > dlv-cert - >右鍵單擊 - > GetInfo - >Access Control (訪問控制) - >選擇“允許所有應(yīng)用程序訪問此項(xiàng)目” - >保存更改。
- 您必須退出“鑰匙串訪問”應(yīng)用程序,才能使用證書并通過終止當(dāng)前運(yùn)行的“任務(wù)門”進(jìn)程重新啟動(dòng)“任務(wù)門”服務(wù)。 或者,您可以重新啟動(dòng)計(jì)算機(jī)。
2)二進(jìn)制安裝 - 在寫go程序的時(shí)候首先創(chuàng)建文件夾$GOPATH/src/github.com/derekparker 并且cd 到c$GOPATH/src/github.com/derekparker目錄下
- clone 這個(gè)項(xiàng)目: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è)一個(gè)CERT環(huán)境變量,其中包含上面創(chuàng)建的證書的名稱。 Makefile還假定GOPATH是單值的,不是冒號(hào)分隔的。 makefile只需要幫助促進(jìn)構(gòu)建和代碼簽名的過程。
- 運(yùn)行以下命令:CERT = dlv-cert make install,它將安裝二進(jìn)制文件并對(duì)其進(jìn)行編碼。
有關(guān)更多信息,請(qǐng)參閱此安裝視頻https://www.youtube.com/watch?v=4ndjybtBg74說明
在構(gòu)建期間取消代碼簽名授權(quán)提示
如果在使用自簽名證書運(yùn)行make時(shí)提示您授權(quán),請(qǐng)嘗試以下操作: - 打開應(yīng)用程序“鑰匙串訪問”(/ Applications / Utilities / Keychain Access.app)
- 雙擊與您的自簽名證書(示例中的dlv-cert)對(duì)應(yīng)的私鑰
- 選擇“Access Control(訪問控制)”選項(xiàng)卡
- 單擊“始終允許這些應(yīng)用程序訪問”下的[+],然后從Finder對(duì)話框中選擇/ usr / bin / codesign
- 點(diǎn)擊“(Save changes)保存更改”按鈕
- 消除“Developer tools access(開發(fā)工具訪問)”提示運(yùn)行delve
如果運(yùn)行dlv時(shí)出現(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)更多信息,請(qǐng)參閱man DevToolsSecurity。
- Linux
請(qǐng)使用以下步驟在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
請(qǐng)使用標(biāo)準(zhǔn)的go get命令在Windows上構(gòu)建和安裝Delvego 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使每個(gè)嘗試都是用戶友好的,確保用戶必須做最少的工作可能開始調(diào)試他們的程序。
請(qǐng)參閱主要使用文檔以進(jìn)一步探索命令。
命令行界面
命令
命令 | 描述 |
args | 打印函數(shù)參數(shù) |
break | 設(shè)置一個(gè)斷點(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)時(shí)執(zhí)行一個(gè)命令 |
print | 評(píng)估表達(dá)式 |
regs | 打印CPU寄存器的內(nèi)容 |
restart | 重啟進(jìn)程 |
set | 更改變量的值 |
source | 執(zhí)行包含delve命令列表的文件 |
sources | 打印源文件列表 |
stack | 打印堆棧跟蹤 |
step | 單步執(zhí)行程序 |
step-instruction | 單步單個(gè)執(zhí)行cpu指令 |
thread | 切換到指定的線程 |
threads | 打印每一個(gè)跟蹤線程的信息 |
trace | 設(shè)置跟蹤點(diǎn) |
types | 打印類型列表 |
vars | 打印某個(gè)包內(nèi)的(全局)變量 |
API
API文檔
Delve公開了主要可以與Delve編程交互的IDEs和編輯器的一個(gè)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
這將以非交互模式啟動(dòng)調(diào)試器,偵聽指定的地址,并啟用日志記錄。 當(dāng)然最后兩個(gè)標(biāo)志(log listen)是可選的。
或者如果您要將多個(gè)客戶端連接到API,也可以指定--accept-multi客戶端標(biāo)志。
您可以使用connect子命令從Delve本身連接headless調(diào)試器:
$ dlv connect 127.0.0.1:8181
這對(duì)于遠(yuǎn)程調(diào)試很有用。
API 接口
Delve已經(jīng)可以允許多個(gè)客戶端/服務(wù)器這種方式的架構(gòu)。因?yàn)樗械?#8220;業(yè)務(wù)邏輯”被抽象出實(shí)際的客戶端/服務(wù)器實(shí)現(xiàn),所有允許容易實(shí)現(xiàn)新的API接口。
當(dāng)前API接口
JSON-RPC
內(nèi)部文件
TODO(derek parker)
將要做的
這個(gè)目錄將包含調(diào)試器內(nèi)部和它如何工作的文檔。
編輯器集成
可以使用以下用于delve編輯器的插件:
1. Golang Plugin for IntelliJ IDEA (https://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 測(cè)試運(yùn)行當(dāng)前包(dlv test)
shift-f5 重新啟動(dòng)當(dāng)前的delve會(huì)話(r / restart)
f6 停止delve (exit / quit / q)
f8 繼續(xù)執(zhí)行 (c / continue)
f9 切換斷點(diǎn)
f10 到下一個(gè)斷電源(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
問題?請(qǐng)直接在go-plus頻道給我發(fā)送消息
已知bugs
- 當(dāng)一個(gè)函數(shù)定義兩個(gè)(或多個(gè))同名的變量時(shí),delve無法區(qū)分它們:locals將打印這兩個(gè)變量,print將隨機(jī)選擇一個(gè)。 參見問題Issue#106。
- Delve目前不支持32位系統(tǒng)。 這通常表現(xiàn)為proc / disasm.go中的編譯器錯(cuò)誤。 參見問題Issue#20。
- 當(dāng)Delve使用go之前的版本1.7.0編譯時(shí),不能使用Receiver.Method Name語法在遠(yuǎn)程包中的函數(shù)上設(shè)置斷點(diǎn)。 參見問題Issue#528。