159 votes

Comment afficher les traces de la pile des goroutines?

J'ai une expérience en Java, et j'adore utiliser le signal QUIT pour inspecter le vidage de thread Java.

Comment faire en sorte que Golang imprime toutes les traces de pile des goroutines ?

31voto

Øyvind Skaar Points 1291

Appuyez sur CTRL+\

(Si vous l'exécutez dans un terminal et que vous voulez simplement arrêter votre programme et vider les go routines, etc.)

J'ai trouvé cette question en cherchant la séquence de touches. Je voulais juste un moyen rapide et facile de savoir si mon programme fuit des go routines :)

14voto

Kyle Kloepper Points 540

Sur les systèmes *NIX (y compris OSX), envoyez un signal d'abandon SIGABRT:

pkill -SIGABRT nom_du_programme

10voto

deeperx Points 144

Par défaut, appuyez sur les touches ^\ ( CTRL+\ ) pour afficher les traces de pile de toutes les goroutines.


Sinon, pour un contrôle plus granulaire, vous pouvez utiliser panic. La méthode simple à partir de Go 1.6+:

go func() {
    s := make(chan os.Signal, 1)
    signal.Notify(s, syscall.SIGQUIT)
    <-s
    panic("give me the stack")
}()

Ensuite, exécutez votre programme de la manière suivante:

# Appuyez sur ^\ pour afficher les traces de pile de toutes les goroutines créées par l'utilisateur
$ GOTRACEBACK=all go run main.go

Si vous souhaitez également afficher les goroutines du runtime de Go:

$ GOTRACEBACK=system go run main.go

Voici toutes les options de GOTRACEBACK:

  • GOTRACEBACK=none omet complètement les traces de pile des goroutines.
  • GOTRACEBACK=single (par défaut) se comporte comme décrit ci-dessus.
  • GOTRACEBACK=all ajoute des traces de pile pour toutes les goroutines créées par l'utilisateur.
  • GOTRACEBACK=system est similaire à all mais ajoute des cadres de pile pour les fonctions d'exécution et montre les goroutines créées internement par l'exécution.
  • GOTRACEBACK=crash est similaire à system mais provoque un crash d'une manière spécifique à l'exploitation système au lieu de quitter. Par exemple, sur les systèmes Unix, le crash déclenche SIGABRT pour générer un vidage de base.

Voici la documentation

La variable GOTRACEBACK contrôle la quantité de sortie générée lorsqu'un programme Go échoue en raison d'une panique non récupérée ou d'une condition d'exécution inattendue.

Par défaut, un échec imprime une trace de pile pour la goroutine actuelle, en ignorant les fonctions internes au système d'exécution, puis se termine avec le code de sortie 2. L'échec imprime les traces de pile de toutes les goroutines s'il n'y a pas de goroutine actuelle ou si l'échec est interne au système d'exécution.

Pour des raisons historiques, les réglages GOTRACEBACK 0, 1 et 2 sont des synonymes de none, all et system, respectivement.

La fonction SetTraceback du package runtime/debug permet d'augmenter la quantité de sortie à l'exécution, mais ne peut pas réduire la quantité en dessous de celle spécifiée par la variable d'environnement. Voir https://golang.org/pkg/runtime/debug/#SetTraceback.

5voto

David Tootill Points 479

Il est nécessaire d'utiliser la longueur renvoyée par runtime.Stack() pour éviter d'imprimer une série de lignes vides après la trace de la pile. La fonction de récupération suivante imprime une trace formatée de manière agréable :

if r := recover(); r != nil {
    log.Printf("Erreur interne : %v", r))
    buf := make([]byte, 1<<16)
    stackSize := runtime.Stack(buf, true)
    log.Printf("%s\n", string(buf[0:stackSize]))
}

2voto

M. Gopal Points 159

Vous pouvez utiliser ceci :

kill -3 VOTRE_ID_PROCESSUS_PID

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X