Avatar ·

如何在Go中获取所有goroutine的堆栈跟踪(stacktrace)以进行调试

你好!我正在用Go编写一个多线程应用程序,它使用了大量goroutine。在某个时刻,程序开始运行不稳定——有时挂起,有时出现奇怪的错误。我怀疑问题在于deadlock(死锁)或goroutine泄漏(即goroutine被创建但未完成)。 我需要了解当前正在运行的goroutine以及它们停止在哪些代码行。我知道在Java中可以使用`jstack`或`Thread.getAllStackTraces()`,但在Go中我没有找到类似的方法。 例如,我有以下代码: ```go package main import ( "fmt" "sync" "time" ) func main() { var wg sync.WaitGroup wg.Add(2) go func() { defer wg.Done() time.Sleep(10 * time.Second) fmt.Println("goroutine 1 done") }() go func() { defer wg.Done() time.Sleep(5 * time.Second) fmt.Println("goroutine 2 done") }() wg.Wait() } ``` 如何在运行时(或在panic时)获取所有goroutine的堆栈跟踪?