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 ?
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 ?
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.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.
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]))
}
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.