30. 如何使用 GDB 調試 Go 程序?

Hi,你們好,我是明哥。linux

在本身學習 Golang 的這段時間裏,我寫了詳細的學習筆記放在個人我的微信公衆號 《Go編程時光》,對於 Go 語言,我也算是個初學者,所以寫的東西應該會比較適合剛接觸的同窗,若是你也是剛學習 Go 語言,不防關注一下,一塊兒學習,一塊兒成長。git

個人在線博客:http://golang.iswbm.com
個人 Github:github.com/iswbm/GolangCodingTimegithub


作爲新手,熟練掌握一個好的調試工具,對於咱們學習語言或者排查問題的時候,很是有幫助。golang

你若是使用 VS Code 或者 Goland ,能夠直接上手,我就再也不寫這方面的文章了。shell

其實相比有用戶界面的 IDE 調試工具,我更喜歡簡單直接的命令行調試,緣由有三點:編程

  1. 速度快,我的感受在 Windows 下速度巨慢
  2. 依賴少,在 Linux 服務器上 也能輕鬆調試
  3. 指令簡單,我習慣只使用快捷鍵就能操做

若是你有和我同樣的感覺和習慣,能夠看下今天的文章,介紹的是 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 的使用方法,很是簡單,能夠本身手動敲下體驗一下。

參考文章

系列導讀

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用法


相關文章
相關標籤/搜索