Panik-Stack-Traces abrufen und speichern
Wenn in einem Go-Programm eine Panik auftritt, wird automatisch ein Stack-Trace mit wertvollen Debugging-Informationen gedruckt Standardausgabe. Bei der Wiederherstellung nach einer Panik gibt „recover()“ jedoch nur eine Fehlerzeichenfolge zurück, die die Ursache der Panik angibt.
Dadurch stellt sich die Frage, ob es möglich ist, den gedruckten Stack-Trace zur weiteren Analyse zu speichern.
Lösung: Verwendung des Runtime-/Debug-Pakets
Um dieses Problem zu beheben, können wir das Runtime-/Debug-Paket nutzen. Indem wir unseren Code in eine verzögerte Funktion einbinden, die „recover()“ aufruft, können wir die Panik abfangen und mit debug.Stack() auf den Stack-Trace zugreifen.
Unten finden Sie ein Beispielcode-Snippet, das diesen Ansatz veranschaulicht:
package main import ( "fmt" "runtime/debug" ) func main() { defer func() { if r := recover(); r != nil { fmt.Println("stacktrace from panic: \n" + string(debug.Stack())) } }() var mySlice []int j := mySlice[0] fmt.Printf("Hello, playground %d", j) }
Bei der Ausführung gibt dieser Code bei einer Panik den folgenden Stack-Trace aus:
stacktrace from panic: goroutine 1 [running]: runtime/debug.Stack(0x1042ff18, 0x98b2, 0xf0ba0, 0x17d048) /usr/local/go/src/runtime/debug/stack.go:24 +0xc0 main.main.func1() /tmp/sandbox973508195/main.go:11 +0x60 panic(0xf0ba0, 0x17d048) /usr/local/go/src/runtime/panic.go:502 +0x2c0 main.main() /tmp/sandbox973508195/main.go:16 +0x60
Dieser Stack-Trace bietet eine detaillierte Ansicht der Funktionsaufrufkette, die zur Panik geführt hat, und erleichtert so die Arbeit um die Fehlerquelle zu lokalisieren.
Das obige ist der detaillierte Inhalt vonWie kann ich den Stack-Trace einer Panik in Go erfassen und speichern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!