在HTTPS.Post() 上調試懸掛的Go C 共享庫
在所描述的問題中,編寫的C 共享庫Go 在嘗試HTTPS.Post() 時遇到掛起。雖然可執行二進位檔案正確運行,但共用程式庫在使用 http.Post() 或 net.Dial() 時遇到此問題。
初步調查:
堆疊追蹤:
SIGQUIT堆疊追蹤表示執行緒掛在runtime.futexsleep()上,用於執行緒同步。
可能的原因和解決方案:
正如已解決的答案中提到的,根本原因在於Go共享庫的載入方式。當共享庫連結到 C 或 C 應用程式時,Go 運行時會在應用程式啟動期間初始化。如果應用程式分叉進程並嘗試在分叉進程中使用 Go 庫,這可能會導致不可預測的行為。
解決方案:
要解決此問題,可以使用以下方法:分叉發生後需要載入 Go 共享庫。這可以透過使用動態連結技術(例如 dlopen() 和 dlsym())來實現。這種方法確保 Go 運行時才在分叉進程中需要時才進行初始化。
結論:
掛起的 C 共享庫的問題是由於導致 Go 運行時的過早初始化。透過在分叉後動態載入庫,問題得到解決,並且共享庫可以正常運作。
以上是## 如何偵錯 Fork 後掛在 HTTPS.Post() 上的 Go C 共用程式庫?的詳細內容。更多資訊請關注PHP中文網其他相關文章!