/* 如何使用 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 官方教程,但感受沒說很細 */