debug 常用操作

/*
如何使用 goland debug goroutine
*/ package main import (
"fmt"
"runtime"
"sync"
) type Tester interface {
test1()
test2()
test3()
} type T struct {
a int
s *sync.WaitGroup
} func main() {
fmt.Println("main start!")
s := &sync.WaitGroup{}
s.Add(3)
t := T{a: 1, s: s} // 斷點
// bebug 到這裡時,需要在幀欄目中選擇 main.test1 的協程幀,不然不會 debug到 test1 函式內部的.或者游標放入 test1 函式內部,點選執行到游標處也行
go t.test1() // 斷點
go t.test2()
go t.test3() // 斷點
s.Wait()
fmt.Println("main end!")
} // 如何進入 goroutine
func (t *T) test1() {
defer func() {
t.s.Done()
}()
t.a++ // 斷點
fmt.Println("test1", t.a)
} //異常斷點
func (t *T) test2() {
defer func() {
// 發生宕機時,獲取panic傳遞的上下文並列印
err := recover()
switch err.(type) {
case runtime.Error: // 執行時錯誤
fmt.Println("runtime error:", err)
default: // 非執行時錯誤
fmt.Println("error:", err)
}
t.s.Done()
}() t.a++
panic("製造一個錯誤")
fmt.Println("test2", t.a)
} // 如何跳過迴圈
func (t *T) test3() {
fmt.Println("test start!") // 斷點
for i := 0; i < 30; i++ { // debug 到一些迴圈時,不想跟蹤每個迴圈執行,可以點選 步出(F8)跳到下一個 debug 點
fmt.Println("test3", i)
}
fmt.Println("test end!") // 斷點
t.s.Done()
} /*
除錯心得:
1.要是協程幀打不開,那可能是幀太多了,可以在 goland 的設定中設定協程數限制
2.有時候上面的方式切換不到想看的協程,可以在協程執行附近(go XXX()處),試試使用執行到游標處(游標放到協程函式中)
3.有時候單步執行到了迴圈中,同樣可以使用執行到游標處(游標點選到迴圈外)或者點選回覆程式按鈕(最好在迴圈外打一個端點,點選恢復程式按鈕會執行到此處)
3.https://www.jetbrains.com/help/go/debugging-code.html 官方教程,但感覺沒說很細
*/