Récupération et stockage des traces de pile de panique
Lorsqu'une panique se produit dans un programme Go, une trace de pile fournissant des informations de débogage précieuses est automatiquement imprimée sur sortie standard. Cependant, lors de la récupération après une panique, recovery() renvoie uniquement une chaîne d'erreur indiquant la cause de la panique.
Cela soulève la question de savoir s'il est possible de stocker la trace de pile imprimée pour une analyse plus approfondie.
Solution : Utilisation du package Runtime/Debug
Pour résoudre ce problème, nous pouvons exploiter le package runtime/debug. En encapsulant notre code dans une fonction différée qui invoque recovery(), nous pouvons capturer la panique et accéder à la trace de la pile à l'aide de debug.Stack().
Vous trouverez ci-dessous un exemple d'extrait de code illustrant cette approche :
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) }
Lors de son exécution, ce code affichera la trace de pile suivante en cas de panique :
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
Cette trace de pile fournit une vue détaillée de la chaîne d'appels de fonction menant à la panique, ce qui la rend plus facile pour identifier la source de l'erreur.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!