Maison >développement back-end >Golang >Comment puis-je récupérer et stocker la trace de pile d'une panique Go pour un débogage plus détaillé ?

Comment puis-je récupérer et stocker la trace de pile d'une panique Go pour un débogage plus détaillé ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-13 02:23:02926parcourir

How can I retrieve and store the stacktrace of a Go panic for more detailed debugging?

Récupération et stockage des traces de pile de Panics

Panics in Go, par défaut, génère une trace de pile sur la sortie standard, fournissant des informations de débogage précieuses. Cependant, la récupération après une panique à l'aide de recovery() renvoie uniquement une description de l'erreur.

Existe-t-il un moyen de récupérer et de stocker la trace de pile produite lors d'une panique, facilitant ainsi l'identification de l'emplacement exact du problème ?

Utilisation du package runtime/debug

La réponse réside dans le package runtime/debug. Ce package fournit un mécanisme pour accéder et stocker la trace de pile associée à une panique. Voici comment :

package main

import (
    "fmt"
    "runtime/debug"
)

func main() {
    defer func() {
        if r := recover(); r != nil {
            fmt.Println("Panic detected:", r)
            stacktrace := debug.Stack()
            fmt.Println("Stacktrace:", string(stacktrace))
        }
    }()

    // Trigger a panic
    var mySlice []int
    j := mySlice[0] // Index out of bounds panic

    fmt.Printf("Hello, playground %d", j)
}

Ce code définit une fonction différée qui gère les éventuelles paniques. Lorsqu'une panique se produit, la fonction recovery() capture l'erreur. De plus, la fonction debug.Stack() est utilisée pour récupérer la trace de pile associée à la panique et la stocker en tant que variable de chaîne. Enfin, l'erreur et le stacktrace sont imprimés sur la console à des fins de débogage.

L'exécution de ce code affichera ce qui suit :

Panic detected: runtime error: index out of range
Stacktrace:
goroutine 1 [running]:
main.main.func1()
    /tmp/sandbox773777618/main.go:11 +0x60
panic(0xf9e00, 0x2078e0)
    /usr/local/go/src/runtime/panic.go:502 +0x2c0
main.main()
    /tmp/sandbox773777618/main.go:17 +0x60

Dans cette sortie, le stacktrace montre clairement la ligne dans le code qui a provoqué la panique, fournissant des informations de débogage plus précieuses que la simple description 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