使用http.Post() 進行編碼。如果我構建exe,就可以了。如果我構建 C 共享庫-buildmode=c-shared,它會掛在 https.Post() 上。我試過strace -fp PID:futex(0x7f618b2c1cd0, FUTEX_WAKE, 1) = 0futex(0xc820022110, FUTEX_WAIT, 0, NULL我試圖添加分析器:http.ListenAndServe("localhost:6060", nil)http.Post()但是它再次掛在 http.Post 上,并且分析器也被阻止了(它正在偵聽,但不是來自 6060 端口的響應)。我已經發送了 SIGQUIT 信號 - 堆棧跟蹤:SIGQUIT: quitPC=0x7f0cad5c9081 m=1goroutine 0 [idle]:runtime.futex(0xc820022110, 0x0, 0x0, 0x0, 0x7f0c00000000, 0x7f0cad577879, 0x0, 0x0, 0x7f0cad577ae8, 0xc820022110, ...) /usr/local/go/src/runtime/sys_linux_amd64.s:288 +0x21runtime.futexsleep(0xc820022110, 0xc800000000, 0xffffffffffffffff) /usr/local/go/src/runtime/os1_linux.go:39 +0x53runtime.notesleep(0xc820022110) /usr/local/go/src/runtime/lock_futex.go:142 +0xa8runtime.stoplockedm() /usr/local/go/src/runtime/proc1.go:1268 +0xb2runtime.schedule() /usr/local/go/src/runtime/proc1.go:1590 +0x72runtime.park_m(0xc820000600) /usr/local/go/src/runtime/proc1.go:1698 +0x191runtime.mcall(0x7f0cad5c722a) /usr/local/go/src/runtime/asm_amd64.s:204 +0x53rax 0xcarbx 0x0rcx 0xffffffffffffffffrdx 0x0rdi 0xc820022110rsi 0x0rbp 0x1rsp 0x7ffe7bc801a8r8 0x0r9 0x0r10 0x0r11 0x286r12 0x4r13 0x7f0cada47090r14 0xdr15 0x8rip 0x7f0cad5c9081rflags 0x286cs 0x33fs 0x0gs 0x0如何調試/解決這個問題?代碼看起來不錯 - 標準的可執行二進制文件返回正確的值。只有 C 共享庫版本有一些問題。共享庫中的另一種方法,不使用 http.post()/net.Dial() 是可以的。原問題:https : //github.com/cavaliercoder/g2z/issues/5
1 回答

慕容森
TA貢獻1853條經驗 獲得超18個贊
好的,我為我的用例解決了這個問題,您可能處于類似的情況。
當您將 Go 共享庫鏈接到 C 或 C++ 應用程序時,Go 運行時會在您啟動應用程序時加載(您可以驗證這一點,func init()
例如,在您啟動應用程序時直接調用它)。然后,如果你 fork 一個進程并使用 Go 庫,你將有不可預測的行為?;旧?,你必須在 fork 之后加載 Go 共享庫,并且一旦你 fork 就不能依賴它。使用dlopen
和dlsym
將允許您控制 Go 運行時何時被加載。
- 1 回答
- 0 關注
- 176 瀏覽
添加回答
舉報
0/150
提交
取消