Le débogage de la bibliothèque partagée C (Go) se bloque lors de l'appel HTTPS.Post()
Le problème survient lorsqu'une bibliothèque partagée Go C (construit avec -buildmode=c-shared) se bloque sur https.Post(). Ce problème ne se produit pas lorsque le code est généré en tant qu'exécutable.
Pour déboguer et résoudre ce problème, considérez les éléments suivants :
Dépannage avec Stracing :
strace -fp PID
Cette commande peut révéler que le programme est bloqué dans les appels futex().
Profilage avancé à l'aide de ListenAndServe :
http.ListenAndServe("localhost:6060", nil) http.Post()
Si le programme se bloque sur http.Post(), cela peut indiquer que le profileur est bloqué.
Analyse de Stack Trace :
http.Post() se bloque lors d'un appel futex(), qui est utilisé pour synchroniser les goroutines. La trace de la pile montre que la goroutine est bloquée au niveau de runtime.futexsleep() et runtime.notesleep().
Solution : Contrôler le chargement du Go Runtime
La solution réside dans le contrôle du moment où le runtime Go est chargé. Lors de la liaison avec une application C ou C, le runtime Go est chargé dès le démarrage de l'application. Cependant, dans un processus forké, ce comportement peut conduire à des résultats imprévisibles.
En utilisant dlopen et dlsym, vous pouvez charger la bibliothèque partagée Go après l'appel fork() et contrôler le moment où le runtime Go est chargé. Cette approche garantit un comportement prévisible au sein des processus forkés.
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!