Golang 入门资料+笔记Golang深入浅出golang

gdb调试运行时go程序

2019-09-30  本文已影响0人  5a532ea43623
> go version    ## golang版本
go version go1.12 linux/amd64
> gdb -v    ## gdb版本
GNU gdb (GDB) 8.3
> cat /etc/redhat-release   ## centos版本
CentOS Linux release 7.7.1908 (Core)

golang官方是不推荐使用该方式调试golang程序的,因为gdb无法准确的诊断golang运行时的数据结构和表达式,官方文档链接戳这里

我个人使用的过程中也遇见了很多问题,比如说脚本无法加载导致groutine命令无法使用

程序例子

//测试死锁例子
package main
import (
    "log"
    "net/http"
    _ "net/http/pprof"
    "os"
    "os/signal"
    "sync"
    "time"
)

func main() {
    //启动pprof
    go func() {
        http.ListenAndServe(":9999", nil)
    }()
  //模拟死锁
    mux := sync.Mutex{}
    for j := 0; j < 10; j ++  {
        go func(num int) {
            for  {
                mux.Lock()
                //defer mux.Unlock()
                log.Printf("number %v get lock",num)
                if num != 9 {
                    mux.Unlock()
                }
                time.Sleep(time.Millisecond*100)
            }
        }(j)
    }
    ShutDownHook()
}
// ShutDownHook 关闭勾子事件
func ShutDownHook() {
    quit := make(chan os.Signal, 1)
    signal.Notify(quit, os.Interrupt, os.Kill)
    a := <-quit
    log.Println("close ",a)
}

使用gdb诊断运行程序死锁状态

待续......

上一篇下一篇

猜你喜欢

热点阅读