Maison >développement back-end >Golang >Comment puis-je capturer et stocker la trace de pile d'une panique dans Go ?

Comment puis-je capturer et stocker la trace de pile d'une panique dans Go ?

DDD
DDDoriginal
2024-11-15 17:07:02633parcourir

How Can I Capture and Store the Stack Trace of a Panic in Go?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn