Dlv懂昂,也稱為Delve千所,是Go語(yǔ)言的源碼調(diào)試工具狂魔。由derekparker開(kāi)發(fā),開(kāi)源與Github淫痰。在Mac上配置Go語(yǔ)言開(kāi)發(fā)環(huán)境的時(shí)候最楷,經(jīng)常碰到的問(wèn)題就是Dlv調(diào)用總是不成功,無(wú)法啟動(dòng)應(yīng)用待错,無(wú)法調(diào)試等等籽孙。大部分的問(wèn)題都與Mac的安全機(jī)制有關(guān)。Mac上使用codesign對(duì)應(yīng)用進(jìn)行簽名火俄,沒(méi)有簽名的程序會(huì)受到一些限制犯建,例如無(wú)法作為調(diào)試程序。
Delve的安裝有兩種方式:
前提
需要安裝Xcode命令行工具瓜客,運(yùn)行以下命令安裝:
$ xcode-select --install
否則會(huì)出現(xiàn)以下錯(cuò)誤:
could not launch process: exec: "lldb-server": executable file not found in $PATH
1. 手動(dòng)安裝
生成證書(shū)和簽名部分參考:安裝Go語(yǔ)言調(diào)試工具dlv
delve下載可以運(yùn)行一下命令:
$ go get github.com/derekparker/delve/cmd/dlv
go get 會(huì)直接編譯安裝dlv适瓦,證書(shū)生成后需要運(yùn)行以下命令對(duì)dlv進(jìn)行簽名
$ CERT=dlv-cert make install
2. HomeBrew安裝
運(yùn)行一下命令:
$ brew install go-delve/delve/delve
理論上來(lái)說(shuō)按照上述兩種方式就可以正常調(diào)試go程序了,但是現(xiàn)實(shí)總是喜歡打臉谱仪,下面就是筆者按照這兩種方式進(jìn)行操作所遇到的一些坑以及找到的解決方案玻熙。
填坑
- 嘗試啟動(dòng)調(diào)試出現(xiàn)如下錯(cuò)誤:
could not launch process: stub exited while waiting for connection: exit status 0
Process exiting with code: 1
解決方案:在配置文件launch.json中加入如下參數(shù)(原理不明):
"backend": "native"
- 筆者手動(dòng)生成證書(shū)并進(jìn)行簽名后,調(diào)試的時(shí)候始終遇到如下錯(cuò)誤:
could not launch process: could not fork/exec
手動(dòng)和homebrew安裝的本質(zhì)其實(shí)是一樣的疯攒,只不過(guò)homebrew安裝的過(guò)程中會(huì)自動(dòng)生成證書(shū)并對(duì)編譯好的dlv文件進(jìn)行簽名嗦随。經(jīng)過(guò)分析基本可以確定是手動(dòng)生成的證書(shū)的問(wèn)題(目前還未發(fā)現(xiàn)證書(shū)的問(wèn)題出在哪)
- 接著嘗試homebrew安裝,還是不順利(心好累)卸例,通過(guò)在安裝命令中加入verbose參數(shù)來(lái)看看到底哪出問(wèn)題了
$ brew install go-delve/delve/delve --verbose
==> Installing delve from go-delve/delve
/usr/bin/sandbox-exec -f /private/tmp/homebrew20180830-36206-1aeuzhj.sb nice /usr/local/Homebrew/Library/Homebrew/vendor/portable-ruby/2.3.7/bin/ruby -W0 -I /usr/local/Homebrew/Library/Homebrew:/usr/local/Homebrew/Library/Homebrew/cask/lib -- /usr/local/Homebrew/Library/Homebrew/build.rb /usr/local/Homebrew/Library/Taps/go-delve/homebrew-delve/Formula/delve.rb --verbose
==> Downloading https://github.com/derekparker/delve/archive/v1.0.0.tar.gz
Already downloaded: /Users/xiongrudy/Library/Caches/Homebrew/delve-1.0.0.tar.gz
==> Verifying delve-1.0.0.tar.gz checksum
tar xf /Users/xiongrudy/Library/Caches/Homebrew/delve-1.0.0.tar.gz -C /private/tmp/delve-20180830-36208-krq4cf
security: SecKeychainSearchCopyNext: The specified item could not be found in the keychain.
==> Generating dlv-cert
==> openssl req -new -newkey rsa:2048 -x509 -days 3650 -nodes -config dlv-cert.cfg -extensions codesign_reqext -batch -out dlv-cert.cer -keyout dlv-cert.key
Generating a 2048 bit RSA private key
...........................+++
...........................+++
writing new private key to 'dlv-cert.key'
-----
==> [SUDO] Installing dlv-cert as root
==> sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain dlv-cert.cer
Failed to execute: sudo
Failed to execute: sudo, 好吧那就是權(quán)限的問(wèn)題了(可能是系統(tǒng)的問(wèn)題吧)
但是homebrew安裝沒(méi)有讓用戶輸入password呀称杨,那就去手動(dòng)執(zhí)行安裝腳本吧,
可以看到delve-1.0.0.tar.gz這個(gè)包是已經(jīng)下載下來(lái)了筷转,接著進(jìn)入到HomeBrew目錄,執(zhí)行以下命令
$ cd $HOME/Library/Caches/Homebrew
$ tar xf delve-*.gz
$ cd delve-1.0.0 (我的是 delve-1.0.0 )
$ sh scripts/gencert.sh
再次執(zhí)行安裝:
$ brew install go-delve/delve/delve --verbose
==> Installing delve from go-delve/delve
/usr/bin/sandbox-exec -f /private/tmp/homebrew20180830-37438-hfl3m9.sb nice /usr/local/Homebrew/Library/Homebrew/vendor/portable-ruby/2.3.7/bin/ruby -W0 -I /usr/local/Homebrew/Library/Homebrew:/usr/local/Homebrew/Library/Homebrew/cask/lib -- /usr/local/Homebrew/Library/Homebrew/build.rb /usr/local/Homebrew/Library/Taps/go-delve/homebrew-delve/Formula/delve.rb --verbose
==> Downloading https://github.com/derekparker/delve/archive/v1.0.0.tar.gz
Already downloaded: /Users/xiongrudy/Library/Caches/Homebrew/delve-1.0.0.tar.gz
==> Verifying delve-1.0.0.tar.gz checksum
tar xf /Users/xiongrudy/Library/Caches/Homebrew/delve-1.0.0.tar.gz -C /private/tmp/delve-20180830-37440-1fuuoa5
==> dlv-cert is already installed, no need to create it
==> make build BUILD_SHA=v1.0.0
go build -ldflags="-s -X main.Build=v1.0.0" github.com/derekparker/delve/cmd/dlv
codesign -s "dlv-cert" ./dlv
==> Cleaning
==> Finishing up
ln -s ../Cellar/delve/1.0.0/bin/dlv dlv
沒(méi)毛病悬而,終于成功了(可以看到提示證書(shū)已經(jīng)安裝了呜舒,不需要再創(chuàng)建了)
事實(shí)上,你如果用這個(gè)證書(shū)再對(duì)手動(dòng)安裝的dlv進(jìn)行簽名也是可以的(筆者親測(cè)可用笨奠,看來(lái)手動(dòng)生成的證書(shū)確實(shí)是有問(wèn)題的袭蝗,雖然我也沒(méi)去研究問(wèn)題在哪)
再次啟動(dòng)調(diào)試唤殴,搞定??,如下圖:
參考鏈接:https://github.com/go-delve/delve/blob/master/Documentation/installation/osx/install.md