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>
Où
Exemple d'utilisation
Voici un exemple de scénario :
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!