为了账号安全,请及时绑定邮箱和手机立即绑定

如何调试 C 共享库(用 Go 编写)——它挂在网络调用上

如何调试 C 共享库(用 Go 编写)——它挂在网络调用上

Go
慕容3067478 2021-11-15 20:39:17
使用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 就不能依赖它。使用dlopendlsym将允许您控制 Go 运行时何时被加载。


查看完整回答
反对 回复 2021-11-15
  • 1 回答
  • 0 关注
  • 149 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信