0x0 起因
在一次優(yōu)化中,增加了按 seller 自動啟動 goroutine 的功能,維護著一個 seller map 將協(xié)程 ID 都存入其中,發(fā)現(xiàn)這個 seller 沒有 goroutine 就自動啟動一個。 當(dāng)時因為 map 沒有加同步鎖,而且是 goroutine 使用 fmt.Print 調(diào)試,各種幾千個重復(fù) print 真是受夠了(誰試誰知道),一個正常的人馬上得精神病。是時候祭出大殺器 VSCode Debug 工具。
0x1 給 VSCode 安裝 debug 包
Debug 估計大家不用陌生,就是通過設(shè)置斷點查看代碼的執(zhí)行情況,在 golang 有一個 debug 包 delve 可以很方便的結(jié)合 VSCode 調(diào)試。
go get -u github.com/derekparker/delve/cmd/dlv
0x2 設(shè)置斷點
假如我們要 debug 下面這段代碼
package main
import "fmt"
var a string
func init() {
a = "a string"
}
func main() {
b := "b string"
fmt.Printf("%s\n%s", a, b)
for i := 1; i < 5; i++ {
fmt.Println(i)
}
fmt.Println("Done")
}
把斷點打在函數(shù)起始行

0x3 開始調(diào)試
按下 F5 啟動調(diào)試(或者找到菜單 - 調(diào)試 - 啟動調(diào)試), 調(diào)試開始你在 VSCode 上方能看到一個調(diào)試控制臺,

分別是:
- 繼續(xù):繼續(xù)運行直到遇到下個斷點
- 單步跳過:跳過此行
- 單步調(diào)試:代碼往下執(zhí)行,深入調(diào)試(可跨文件)
- 單步跳出:跳出當(dāng)前調(diào)試函數(shù)
- 重啟:重新啟動調(diào)試
- 停止:停止調(diào)試

0x4 查看調(diào)試信息
上面動圖已經(jīng)完成了完整的一次簡單調(diào)試,那么通過上面的調(diào)試我們可以看到什么樣的信息呢?
- 局部變量
當(dāng)前作用域的所有局部變量。

- 全局變量
在監(jiān)視面板添加你需要監(jiān)視的全局變量。

- 堆棧信息
暫時跳過,里面信息還看不懂。

- 調(diào)試信息。

0x5 高級功能
- 條件斷點
顧名思義,當(dāng)達(dá)到指定條件之后才會觸發(fā)斷點,貌似 golang 暫時還不支持下次補上
0x6 尾聲
Cool,恭喜你。學(xué)會了偷看你的 golang 腳本干的羞羞事情,那么其他語言遇到了類似情況,你已經(jīng)知道怎么做了。如果你有 Debug 新發(fā)現(xiàn),歡迎更新此文。