如何在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的堆栈跟踪?