調試C 共享庫(Go) 在HTTPS.Post() 呼叫上掛起
Go C 共享庫時會出現問題(使用-buildmode=c-shared 建置)掛在https.Post() 上。當程式碼建構為可執行檔時,不會出現此問題。
要調試和解決此問題,請考慮以下事項:
使用Stracing 進行故障排除:
strace -fp PID
使用ListenAndServe 進行進階分析:
http.ListenAndServe("localhost:6060", nil) http.Post()
分析堆疊追蹤:
http.Post() 掛在 futex() 呼叫上,該呼叫用於同步 goroutine。堆疊追蹤顯示 goroutine 在runtime.futexsleep() 和runtime.notesleep() 處被阻塞。解決方案:控制Go 運行時載入
解決方案在於控制Go運行時的載入時間。當與 C 或 C 應用程式連結時,Go 運行時會在應用程式啟動後立即載入。然而,在分叉進程中,這種行為可能會導致不可預測的結果。 透過使用 dlopen 和 dlsym,您可以在 fork() 呼叫後載入 Go 共享函式庫,並控制 Go 執行時間的載入時間。這種方法確保了分叉進程中的可預測行為。以上是以下是一些標題選項,可以抓住文章的本質並將其框架為一個問題: **選項1(關注問題):** * **為什麼 L 時我的 Go C 共享庫會掛在 https.Post() 上的詳細內容。更多資訊請關注PHP中文網其他相關文章!