运行时死锁检测:利用 trace 和 pprof 可视化goroutine等待图
通过 Go 的 runtime/trace 和 net/http/pprof 组合,实时检测并分析死锁发生的 goroutine 链。 · 难度:入门 · +10XP
运行时死锁检测
死锁是并发编程中的常见问题,Go 提供了 runtime/trace 包来记录 goroutine 的创建、阻塞和同步事件。本教程指导如何生成 trace 文件并使用 go tool trace 查看等待图,同时结合 pprof 的 goroutine 堆栈识别死锁循环。通过一个模拟死锁的示例,你将学会如何快速定位死锁根源并修复。
package main
import (
"fmt"
"os"
"runtime/trace"
"sync"
)
func main() {
f, _ := os.Create("trace.out")
defer f.Close()
trace.Start(f)
defer trace.Stop()
var mu1, mu2 sync.Mutex
var wg sync.WaitGroup
wg.Add(2)
go func() {
defer wg.Done()
mu1.Lock()
mu2.Lock()
mu2.Unlock()
mu1.Unlock()
}()
go func() {
defer wg.Done()
mu2.Lock()
mu1.Lock()
mu1.Unlock()
mu2.Unlock()
}()
wg.Wait()
fmt.Println("done")
}