Hi,大家好,我是明哥,
在自己學習 Golang 的這段時間里,我寫了詳細的學習筆記放在我的個人微信公眾號 《Go編程時光》,對于 Go 語言,我也算是個初學者,因此寫的東西應該會比較適合剛接觸的同學,如果你也是剛學習 Go 語言,不防關注一下,一起學習,一起成長,
我的在線博客:http://golang.iswbm.com
我的 Github:github.com/iswbm/GolangCodingTime
做為新手,熟練掌握一個好的除錯工具,對于我們學習語言或者排查問題的時候,非常有幫助,
你如果使用 VS Code 或者 Goland ,可以直接上手,我就不再寫這方面的文章了,
其實相比有用戶界面的 IDE 除錯工具,我更喜歡簡單直接的命令列除錯,原因有三點:
- 速度快,個人感覺在 Windows 下速度巨慢
- 依賴少,在 Linux 服務器上 也能輕松除錯
- 指令簡單,我習慣只使用快捷鍵就能操作
如果你有和我一樣的感受和習慣,可以看下今天的文章,介紹的是 GDB 除錯工具,
1. 下載安裝 Go
在 Linux 上進行除錯,那咱所以得先安裝 Go ,由于第一節里只講了 Windows 的下載安裝,并沒有講到在 Linux 上如何安裝,所以這里要先講一下,已經安裝過了可以直接跳過,
首先在 go 下載頁面上(https://golang.org/dl/),查看并復制原始碼包的的下載地址

登陸 linux 機器 ,使用 wget 下載
$ wget https://dl.google.com/go/go1.14.2.linux-amd64.tar.gz

將下載的原始碼包解壓到 /usr/local 目錄下,并設定環境變數
[root@localhost ~]# tar -C /usr/local -xzf go1.14.2.linux-amd64.tar.gz
[root@localhost ~]#
[root@localhost ~]# export PATH=$PATH:/usr/local/go/bin
[root@localhost ~]# which go
/usr/local/go/bin/go
[root@localhost ~]#
[root@localhost ~]# go version
go version go1.14.2 linux/amd64
[root@localhost ~]#
2. 開始進行除錯
除錯使用的是 GDB (好像要求版本 7.1 + ),使用前,請先確保你的機器上已經安裝 GDB
[root@localhost code]# which gdb
/usr/bin/gdb
準備就緒后,先在目錄下寫一個測驗檔案
package main
import "fmt"
func main(){
msg := "hello, world"
fmt.Println(msg)
}
然后執行 如下命令進行編譯,里面有好多個引數,有疑問的可以自行搜索引擎
# 關閉行內優化,方便除錯
$ go build -gcflags "-N -l" demo.go
# 發布版本洗掉除錯符號
go build -ldflags “-s -w”
最后使用 GDB 命令進入除錯界面
# 如果你喜歡這種界面的話,用這條命令
$ gdb -tui demo
# 如果你跟我一樣不喜歡不習慣用界面,就使用這個命令
$ gdb demo
完整操作如下:

進入 GDB 除錯界面后,并不是立即可用,你先需要回車,然后再你敲入幾行命令,除錯視窗就會出現代碼,
(gdb) b main.main # 在 main 包里的 main 函式 加斷點
Breakpoint 1 at 0x4915c0: file /home/wangbm/code/demo.go, line 5.
(gdb) run # 執行行程
Starting program: /home/wangbm/code/demo
Breakpoint 1, main.main () at /home/wangbm/code/demo.go:5
(gdb)

3. 詳解除錯指令
要熟練使用 GDB ,你得熟悉的掌握它的指令,這里列舉一下
-
r:run,執行程式 -
n:next,下一步,不進入函式 -
s:step,下一步,會進入函式 -
b:breakponit,設定斷點 -
l:list,查看原始碼 -
c:continue,繼續執行到下一斷點 -
bt:backtrace,查看當前呼叫堆疊 -
p:print,列印查看變數 -
q:quit,退出 GDB -
whatis:查看物件型別 -
info breakpoints:查看所有的斷點 -
info locals:查看區域變數 -
info args:查看函式的引數值及要回傳的變數值 -
info frame:堆疊幀資訊 -
info goroutines:查看 goroutines 資訊,在使用前 ,需要注意先執行 source /usr/local/go/src/runtime/runtime-gdb.py -
goroutine 1 bt:查看指定序號的 goroutine 呼叫堆疊 -
回車:重復執行上一次操作
其中有幾個指令的使用比較靈活
比如 l - list,查看代碼
# 查看指定行數上下5行
(gdb) l 8
# 查看指定范圍的行數
(gdb) l 5:8
# 查看指定檔案的行數上下5行
l demo.go:8
# 可以查看函式,記得加包名
l main.main
把上面的 l 換成 b ,大多數也同樣適用
# 在指定行打斷點
(gdb) b 8
# 在指定指定檔案的行打斷點
b demo.go:8
# 在指定函式打斷點,記得加包名
b main.main
還有 p - print,列印變數
# 查看變數
(gdb) p var
# 查看物件長度或容量
(gdb) p $len(var)
(gdb) p $cap(var)
# 查看物件的動態型別
(gdb) p $dtype(var)
(gdb) iface var
# 舉例如下
(gdb) p i
$4 = {str = "cbb"}
(gdb) whatis i
type = regexp.input
(gdb) p $dtype(i)
$26 = (struct regexp.inputBytes *) 0xf8400b4930
(gdb) iface i
regexp.input: struct regexp.inputBytes *
以上就是關于 GDB 的使用方法,非常簡單,可以自己手動敲下體驗一下,
參考文章
- go 官方對于 gdb 的使用說明
- Mac 除錯 golang 程式
系列導讀
01. 開發環境的搭建(Goland & VS Code)
02. 學習五種變數創建的方法
03. 詳解資料型別:****整形與浮點型
04. 詳解資料型別:byte、rune與string
05. 詳解資料型別:陣列與切片
06. 詳解資料型別:字典與布爾型別
07. 詳解資料型別:指標
08. 面向物件編程:結構體與繼承
09. 一篇文章理解 Go 里的函式
10. Go語言流程控制:if-else 條件陳述句
11. Go語言流程控制:switch-case 選擇陳述句
12. Go語言流程控制:for 回圈陳述句
13. Go語言流程控制:goto 無條件跳轉
14. Go語言流程控制:defer 延遲呼叫
15. 面向物件編程:介面與多型
16. 關鍵字:make 和 new 的區別?
17. 一篇文章理解 Go 里的陳述句塊與作用域
18. 學習 Go 協程:goroutine
19. 學習 Go 協程:詳解信道/通道
20. 幾個信道死鎖經典錯誤案例詳解
21. 學習 Go 協程:WaitGroup
22. 學習 Go 協程:互斥鎖和讀寫鎖
23. Go 里的例外處理:panic 和 recover
24. 超詳細解讀 Go Modules 前世今生及入門使用
25. Go 語言中關于包匯入必學的 8 個知識點
26. 如何開源自己寫的模塊給別人用?
27. 說說 Go 語言中的型別斷言?
28. 這五點帶你理解Go語言的select用法

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/6570.html
標籤:Go
上一篇:golang orm
