Maison >développement back-end >Golang >Comment obtenir des traces de pile pour toutes les goroutines dans un processus Go en cours d'exécution ?

Comment obtenir des traces de pile pour toutes les goroutines dans un processus Go en cours d'exécution ?

Linda Hamilton
Linda Hamiltonoriginal
2024-10-31 15:38:37612parcourir

How to Get Stack Traces for All Goroutines in a Running Go Process?

Comment vider les traces de pile pour toutes les goroutines dans un processus Go en cours d'exécution

Lors du débogage ou du dépannage d'un processus Go, obtention de traces de pile pour tous ses goroutines peuvent être cruciales. Cependant, le faire sans modifier le code source ni mettre fin au processus peut s'avérer difficile. Ce guide propose une solution à ce problème.

Le runtime Go inclut une fonctionnalité qui vous permet de vider les traces de pile à la demande. Cependant, l'invocation de cette fonctionnalité depuis l'extérieur du processus n'est pas immédiatement apparente.

Utilisation d'un gestionnaire de signal

Pour capturer les traces de pile pour toutes les goroutines, vous pouvez configurer un signal gestionnaire qui écoute un signal spécifique. Lorsque le signal est reçu, le gestionnaire génère et imprime les traces de pile.

Voici un exemple d'extrait de code :

<code class="go">import (
    "fmt"
    "os"
    "os/signal"
    "runtime"
    "syscall"
)

func main() {
    // Create a channel to receive signals.
    sigChan := make(chan os.Signal)

    // Start a goroutine that will write stack traces to the channel.
    go func() {
        // Create a buffer to hold the stack trace.
        stacktrace := make([]byte, 8192)

        // Loop until a signal is received.
        for _ = range sigChan {
            length := runtime.Stack(stacktrace, true)
            fmt.Println(string(stacktrace[:length]))
        }
    }()

    // Register to receive SIGQUIT signals.
    signal.Notify(sigChan, syscall.SIGQUIT)

    // Continue with the main application logic.
    ...
}</code>

Envoi du signal

Une fois le gestionnaire configuré, vous pouvez envoyer le signal SIGQUIT au processus pour déclencher le vidage de la trace de la pile. Vous pouvez le faire en utilisant la commande suivante :

kill -QUIT <process id>

est l'ID du processus Go.

Exemple d'utilisation

Voici un exemple de scénario :

  1. Exécutez l'extrait de code fourni ci-dessus en tant que processus Go séparé.
  2. Lorsque le processus est en cours d'exécution, ouvrez une fenêtre de terminal et entrez la commande kill :

    kill -QUIT <process id>

La pile trace pour tous les les goroutines du processus Go seront imprimées dans la fenêtre du terminal.

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