Maison > développement back-end > Golang > le corps du texte

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

Linda Hamilton
Libérer: 2024-10-31 15:38:37
original
537 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion
Copier après la connexion

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>
    Copier après la connexion
    Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!