dlv支持debug吗氏、attach和exec三種方式幅垮。其中乌昔,exec方式類似于gdb /path/to/program隙疚,可以讓調(diào)試器(dlv)去啟動目標(biāo)程序,然后立即掛載上去進行調(diào)試磕道。類似Java的jwdp中suspend=true的方式供屉,這種方式啟動的程序它不會立即執(zhí)行,而是hold在那里溺蕉,等待調(diào)試器的進一步指令伶丐,非常適合于觀察和研究啟動過程和邏輯。
本文假設(shè)遠端和近端都裝好了dlv疯特,而且Visual Code的debug方案也已經(jīng)添加完畢哗魂。相關(guān)的操作可以參考利用delve(dlv)在Visual Code中進行g(shù)o程序的遠程調(diào)試-debug方式的準(zhǔn)備部分。
環(huán)境
這部分內(nèi)容和attach方式的那一篇一樣
- 近端
- Win7 64bit
- Visual Code 1.32.1 x64
- Go 1.10
- dlv 1.2
- 遠端
- OpenSuSE 42.1
- Go 1.10
- dlv 1.2
- 示例項目
- hello/main.go漓雅,內(nèi)容如下
package main
import (
"fmt"
"time"
)
const loopTimes = 60
func main() {
for i := 1; i < loopTimes; i++ {
time.Sleep(1 * time.Second)
fmt.Printf("\rLoop %v", i)
}
fmt.Println("")
}
準(zhǔn)備01. 編譯目標(biāo)程序
這部分內(nèi)容和attach方式的那一篇一樣录别,做過可以跳過
就像javac和gcc一樣朽色,go編譯器默認會在編譯時,對最終的可執(zhí)行代碼執(zhí)行面向機器的開發(fā)组题,而使得人類進行調(diào)試時不好理解葫男。因此,如果在編譯要被調(diào)試的目標(biāo)程序時崔列,最好禁用掉這些優(yōu)化梢褐。Go 1.10及之后的版本,在編譯時赵讯,加入-gcflags="all=-N -l"
選項利职;而之前的版本,則是加入-gcflags="-N -l"
選項瘦癌。
在實例項目和環(huán)境中猪贪,我們用的是go 1.10,所以編譯用的命令就變成這樣了讯私。
# 進入實例項目目錄
cd $GOPATH/src/hello
# 執(zhí)行編譯任務(wù)
go build -gcflags="all=-N -l" hello
# 將編譯好的程序拷貝到?jīng)]有源代碼的/tmp目錄下热押,留作后面的步驟使用
mv hello /tmp
準(zhǔn)備02. 啟動目標(biāo)程序
這部分內(nèi)容和attach方式的那一篇一樣,做過可以跳過
這次我們要做的是對“在運行程序”的遠程調(diào)試工作斤寇,所以在調(diào)試開始之前桶癣,需要先把程序運行起來——但也就是單純地按照程序的正常啟動方法就行,不需要額外的參數(shù)或者調(diào)整娘锁。
/tmp/hello
執(zhí)行方法
雖然不再需要代碼牙寞,但與dlv debug一樣,我們需要先在遠端啟動dlv的服務(wù)端莫秆。
dlv exec --headless --listen ":2345" --log --api-version 2 /tmp/hello
畫面顯示類似以下內(nèi)容則說明dlv服務(wù)端已經(jīng)就緒间雀。
API server listening at: [::]:2345
INFO[0000] launching process with args: [/tmp/hello] layer=debugger
和之前的dlv debug方式一樣,回到Visual Code入debug界面镊屎,選擇“Launch remote”方案后惹挟,點擊啟動來進行g(shù)o debugger,就能啟動遠程調(diào)試了缝驳。
總結(jié)
exec方式的作用看起來有點土连锯,但在開發(fā)測試階段,應(yīng)該也有不少情況會用到這個方式用狱。和attach模式一樣要留意运怖,在Visual Code的debug控制欄里點擊Stop按鈕,會終結(jié)掉(可以理解為kill)你正在調(diào)試的目標(biāo)程序夏伊。和attach方式不一樣摇展,想要安全地關(guān)閉調(diào)試的話,目前最好的方法那就是另開一個對話去kill掉dlv而不碰目標(biāo)程序署海。
這里無論是dlv還是Visual Code都沒有記述有更優(yōu)雅的方法吗购,關(guān)閉調(diào)試而留下目標(biāo)程序繼續(xù)運作。畢竟我覺得kill還是一個需要挺多人力砸狞,尤其是避免誤殺而需要的注意力捻勉,的方式。但也可能是我沒看到刀森,如果找著了踱启,我再更新吧。