Capturer les piles de processus Go de manière non invasive
Pour capturer les traces de pile de toutes les goroutines d'un processus Go en cours d'exécution sans interrompre son exécution, suivez ces étapes :
Établir un gestionnaire de signal :
<code class="go">import ( "os" "os/signal" "runtime" "syscall" ) func main() { sigChan := make(chan os.Signal) go func() { stacktrace := make([]byte, 8192) for _ = range sigChan { length := runtime.Stack(stacktrace, true) fmt.Println(string(stacktrace[:length])) } }() signal.Notify(sigChan, syscall.SIGQUIT) }</code>
Recevoir le signal SIGQUIT :
La fonction de gestionnaire au sein de la goroutine capturera le signal SIGQUIT.
Générer Stack Trace :
Le runtime.Stack La fonction est utilisée pour générer la trace de pile pour chaque goroutine.
Gérer les contraintes de mémoire :
Le tampon de trace de pile a une limite de taille. Si le tampon est dépassé, la trace sera tronquée.
Imprimer les traces de la pile :
Les traces de pile générées seront imprimées sur la sortie standard .
En configurant ce gestionnaire de signaux, vous pouvez capturer et afficher efficacement les traces de pile pour toutes les goroutines du processus Go en cours d'exécution sans modifier son code source ni mettre fin à son exécution.
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!