Hi,你們好,我是明哥。linux
在本身學習 Golang 的這段時間裏,我寫了詳細的學習筆記放在個人我的微信公衆號 《Go編程時光》,對於 Go 語言,我也算是個初學者,所以寫的東西應該會比較適合剛接觸的同窗,若是你也是剛學習 Go 語言,不防關注一下,一塊兒學習,一塊兒成長。git
個人在線博客:http://golang.iswbm.com
個人 Github:github.com/iswbm/GolangCodingTimegithub
作爲新手,熟練掌握一個好的調試工具,對於咱們學習語言或者排查問題的時候,很是有幫助。golang
你若是使用 VS Code 或者 Goland ,能夠直接上手,我就再也不寫這方面的文章了。shell
其實相比有用戶界面的 IDE 調試工具,我更喜歡簡單直接的命令行調試,緣由有三點:編程
若是你有和我同樣的感覺和習慣,能夠看下今天的文章,介紹的是 GDB 調試工具。數組
在 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 ~]#
調試使用的是 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)
要熟練使用 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 的使用方法,很是簡單,能夠本身手動敲下體驗一下。
參考文章
系列導讀
24. 超詳細解讀 Go Modules 前世此生及入門使用