So erhält man einen Stacktrace aller Goroutinen in Go zum Debuggen
Hallo! Ich schreibe eine Multithread-Anwendung in Go, die viele Goroutinen verwendet. Irgendwann beginnt das Programm instabil zu laufen – es hängt sich auf oder gibt seltsame Fehler aus. Ich vermute, dass das Problem ein Deadlock (gegenseitige Blockierung) oder ein Goroutine-Leak (wenn Goroutinen erstellt, aber nicht beendet werden) ist.
Ich muss verstehen, welche Goroutinen gerade laufen und an welchen Codezeilen sie angehalten sind. Ich weiß, dass man in Java `jstack` oder `Thread.getAllStackTraces()` verwenden kann, aber in Go habe ich kein Äquivalent gefunden.
Zum Beispiel habe ich diesen Code:
```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()
}
```
Wie kann ich zur Laufzeit (oder bei einer Panic) einen Stacktrace aller Goroutinen erhalten?