Debuggen einer hängenden Go C-Shared-Bibliothek auf HTTPS.Post()
Im beschriebenen Problem wurde eine C-Shared-Bibliothek geschrieben Beim Versuch, HTTPS.Post() auszuführen, bleibt Go hängen. Während die ausführbare Binärdatei ordnungsgemäß ausgeführt wird, tritt in der gemeinsam genutzten Bibliothek dieses Problem bei Verwendung von http.Post() oder net.Dial() auf.
Erste Untersuchungen:
Stack-Trace:
Der SIGQUIT-Stack-Trace zeigte an, dass der Thread bei runtime.futexsleep() hängen blieb, das für die Thread-Synchronisierung verwendet wird.
Mögliche Ursache und Lösung:
Wie in der gelösten Antwort erwähnt, liegt die Ursache in der Art und Weise, wie die gemeinsam genutzte Go-Bibliothek geladen wird. Wenn die gemeinsam genutzte Bibliothek mit einer C- oder C-Anwendung verknüpft ist, wird die Go-Laufzeit beim Anwendungsstart initialisiert. Dies kann zu unvorhersehbarem Verhalten führen, wenn die Anwendung Prozesse verzweigt und versucht, die Go-Bibliothek in den verzweigten Prozessen zu verwenden.
Lösung:
Um dieses Problem zu beheben, ist es so erforderlich, um die gemeinsam genutzte Go-Bibliothek zu laden, nachdem die Verzweigung stattgefunden hat. Dies kann durch die Verwendung dynamischer Verknüpfungstechniken wie dlopen() und dlsym() erreicht werden. Dieser Ansatz stellt sicher, dass die Go-Laufzeit nur dann initialisiert wird, wenn sie innerhalb des Fork-Prozesses benötigt wird.
Fazit:
Das Problem mit der hängenden C-Shared-Bibliothek war darauf zurückzuführen zur vorzeitigen Initialisierung der Go-Laufzeit. Durch das dynamische Laden der Bibliothek nach dem Forken wurde das Problem behoben und die gemeinsam genutzte Bibliothek funktionierte ordnungsgemäß.
Das obige ist der detaillierte Inhalt von## Wie debugge ich eine Go C-Shared-Bibliothek, die nach dem Forken an HTTPS.Post() hängt?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!