使用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 关注
- 149 浏览
添加回答
举报
0/150
提交
取消