溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Linux系統(tǒng)上怎么進(jìn)行Go語言程序調(diào)試

發(fā)布時間:2023-05-16 15:25:51 來源:億速云 閱讀:145 作者:iii 欄目:編程語言

這篇文章主要講解了“Linux系統(tǒng)上怎么進(jìn)行Go語言程序調(diào)試”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Linux系統(tǒng)上怎么進(jìn)行Go語言程序調(diào)試”吧!

調(diào)試工具

Go語言提供了內(nèi)置的調(diào)試器——go debug,但是Go的高效特性也帶來了許多調(diào)試挑戰(zhàn)。Dlv(https://github.com/go-delve/delve)是一個 Go 語言的現(xiàn)代調(diào)試器,能夠支持 Go 特定的調(diào)試功能。Dlv 提供了單步跟蹤、查看變量、修改變量和斷點(diǎn)等常用的調(diào)試功能。另外,GDB也支持Go語言的調(diào)試,但是它不能理解Go語言的調(diào)度器,因此更適合開發(fā)內(nèi)核或只需要使用少量Go特定功能的程序調(diào)試。

安裝Dlv

Dlv是用Go語言編寫的,因此安裝它需要先安裝Go語言本身??梢詮墓俜骄W(wǎng)站(https://golang.org/dl/)下載最新版本的Go語言安裝包,并將其配置到環(huán)境變量中。

安裝完成Go語言后,我們需要先安裝Dlv依賴的庫——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目錄中,可以手動將其添加到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)識以確保編譯器不會優(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í)行到該處位置時停止。

使用Dlv可以通過以下兩種方式設(shè)置斷點(diǎn):

  1. 圖形界面(推薦)

使用Dlv的圖形界面可以更加直觀地對程序進(jìn)行操作和修改。執(zhí)行以下命令,接著會自動開啟圖形界面:

dlv debug ./debug-demo
  1. 命令行

執(zhí)行以下命令進(jìn)入Dlv命令行模式:

dlv debug ./debug-demo --headless --listen=:2345 --api-version=2

進(jìn)入Dlv后,我們可以使用break(或縮寫為b)命令設(shè)置斷點(diǎn):

(b)reak {<location>|<function>|<filename>:<line>|<remote package path>}: 設(shè)置斷點(diǎn)
(b)reakpoints: 顯示當(dāng)前所有的斷點(diǎn)
(d)elete {<breakpoint#>|<breakpoint.id>}: 刪除斷點(diǎn)#或通過Breakpoint.id刪除指定斷點(diǎn)
(c)ontinue: 從當(dāng)前位置繼續(xù)執(zhí)行程序,直到下一個斷點(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 <variable>: 顯示變量

例如,我們可以使用以下命令查看變量a和變量b:

(p)rint a
(p)rint b

修改變量

除了查看變量外,Dlv還支持修改變量的值,使用set命令修改變量的值:

(s)et <variable> = <value>: 修改變量的值

例如,我們可以使用以下命令將變量a的值修改為100:

(s)et a = 100

感謝各位的閱讀,以上就是“Linux系統(tǒng)上怎么進(jìn)行Go語言程序調(diào)試”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對Linux系統(tǒng)上怎么進(jìn)行Go語言程序調(diào)試這一問題有了更深刻的體會,具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識點(diǎn)的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI