這篇文章主要講解了“Linux系統(tǒng)上怎么進(jìn)行Go語(yǔ)言程序調(diào)試”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Linux系統(tǒng)上怎么進(jìn)行Go語(yǔ)言程序調(diào)試”吧!
站在用戶的角度思考問題,與客戶深入溝通,找到北安網(wǎng)站設(shè)計(jì)與北安網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:做網(wǎng)站、成都網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名申請(qǐng)、虛擬空間、企業(yè)郵箱。業(yè)務(wù)覆蓋北安地區(qū)。
調(diào)試工具
Go語(yǔ)言提供了內(nèi)置的調(diào)試器——go debug,但是Go的高效特性也帶來了許多調(diào)試挑戰(zhàn)。Dlv(https://github.com/go-delve/delve)是一個(gè) Go 語(yǔ)言的現(xiàn)代調(diào)試器,能夠支持 Go 特定的調(diào)試功能。Dlv 提供了單步跟蹤、查看變量、修改變量和斷點(diǎn)等常用的調(diào)試功能。另外,GDB也支持Go語(yǔ)言的調(diào)試,但是它不能理解Go語(yǔ)言的調(diào)度器,因此更適合開發(fā)內(nèi)核或只需要使用少量Go特定功能的程序調(diào)試。
安裝Dlv
Dlv是用Go語(yǔ)言編寫的,因此安裝它需要先安裝Go語(yǔ)言本身??梢詮墓俜骄W(wǎng)站(https://golang.org/dl/)下載最新版本的Go語(yǔ)言安裝包,并將其配置到環(huán)境變量中。
安裝完成Go語(yǔ)言后,我們需要先安裝Dlv依賴的庫(kù)——dynamically linked Linux utilities:
sudo apt-get update sudo apt-get install linux-tools-common linux-tools-generic linux-tools-`uname -r`
接著執(zhí)行以下命令安裝Dlv:
go get -u github.com/go-delve/delve/cmd/dlv
以上命令將Dlv安裝到$GOPATH/bin目錄中,可以手動(dòng)將其添加到PATH變量,也可以通過以下命令將其添加到PATH中:
echo "export PATH=$PATH:$(go env GOPATH)/bin" >> ~/.bashrc source ~/.bashrc
編譯調(diào)試程序
我們需要進(jìn)入程序所在的目錄,使用go build編譯程序并生成二進(jìn)制文件。假設(shè)我們的程序名為debug-demo,我們可以通過以下命令進(jìn)行編譯:
go build -gcflags "-N -l" -o debug-demo
-gcflags "-N -l":添加編譯標(biāo)識(shí)以確保編譯器不會(huì)優(yōu)化代碼,從而方便調(diào)試。
-o debug-demo:將生成的可執(zhí)行文件命名為debug-demo。
為了解決源碼被匯編的問題,我們還可以使用go env命令獲取CGO_ENABLED的值,并將它設(shè)置為0,然后再次進(jìn)行編譯:
go env go build -gcflags "-N -l" -o debug-demo -tags netgo -ldflags '-w -extldflags "-static"' -v main.go
設(shè)置斷點(diǎn)
在程序中設(shè)置斷點(diǎn)是調(diào)試過程中最為常用的操作。我們可以在代碼的任意位置設(shè)置斷點(diǎn),以等待程序執(zhí)行到該處位置時(shí)停止。
使用Dlv可以通過以下兩種方式設(shè)置斷點(diǎn):
圖形界面(推薦)
使用Dlv的圖形界面可以更加直觀地對(duì)程序進(jìn)行操作和修改。執(zhí)行以下命令,接著會(huì)自動(dòng)開啟圖形界面:
dlv debug ./debug-demo
命令行
執(zhí)行以下命令進(jìn)入Dlv命令行模式:
dlv debug ./debug-demo --headless --listen=:2345 --api-version=2
進(jìn)入Dlv后,我們可以使用break(或縮寫為b)命令設(shè)置斷點(diǎn):
(b)reak {| | : | }: 設(shè)置斷點(diǎn) (b)reakpoints: 顯示當(dāng)前所有的斷點(diǎn) (d)elete { | }: 刪除斷點(diǎn)#或通過Breakpoint.id刪除指定斷點(diǎn) (c)ontinue: 從當(dāng)前位置繼續(xù)執(zhí)行程序,直到下一個(gè)斷點(diǎn)或程序完結(jié)
例如,我們可以在程序的第10行設(shè)置斷點(diǎn):
(b)reak main.go:10
控制程序運(yùn)行
在程序運(yùn)行過程中,可以使用step(或縮寫為s)和next(或縮寫為n)命令控制程序運(yùn)行:
(s)tep: 單步調(diào)試,如果當(dāng)前位置是函數(shù),則進(jìn)入該函數(shù)內(nèi)部 (n)ext: 單步調(diào)試,如果當(dāng)前位置是函數(shù),則不進(jìn)入該函數(shù)內(nèi)部
查看變量
Dlv也提供了顯示變量的命令,使用print(或縮寫為p)命令可以查看當(dāng)前作用域中的變量:
(p)rint: 顯示變量
例如,我們可以使用以下命令查看變量a和變量b:
(p)rint a (p)rint b
修改變量
除了查看變量外,Dlv還支持修改變量的值,使用set命令修改變量的值:
(s)et= : 修改變量的值
例如,我們可以使用以下命令將變量a的值修改為100:
(s)et a = 100
感謝各位的閱讀,以上就是“Linux系統(tǒng)上怎么進(jìn)行Go語(yǔ)言程序調(diào)試”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)Linux系統(tǒng)上怎么進(jìn)行Go語(yǔ)言程序調(diào)試這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!