如何使用GoLand debug

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 官方教程,但感覺沒說很細
*/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章