go 编译成 c shared 库使用 luaffi load 会死锁

2019-05-27 18:17:31 +08:00
 fengjianxinghun

export go 函数然后编译成 c 动态库,这里完美注意了 cgo 的内存搬运问题。

go build -o iface.so -buildmode=c-shared -ldflags "-w -s" iface.go

然后在 OpenResty 下用 luaffi load 这个动态库,平时使用没什么问题。最近发现在 reload 比较频繁下会偶发 reload 卡住。

上去用 gdb -p <nginx master="" pid=""></nginx>

bt 当前栈顶在这个 go 动态库中,由于没有调试符号,只能反汇编。

diss/r $rip,查看 syscall 前的 rax 值,发现当前 master 阻塞在 futex syscall 上,发生了死锁。

3269 次点击
所在节点    Go 编程语言
4 条回复
kofj
2019-05-27 22:12:32 +08:00
还能这么玩儿,mark 一下
chennqqi
2019-05-28 09:42:01 +08:00
把 -ldflags "-w -s" 去掉就有符号了,挂上去调试吧
icexin
2019-05-28 11:53:51 +08:00
fork+多线程会有很多 bug
juzipeek
2019-05-28 12:27:09 +08:00
reload 时动态是否有变化,如果有变化容易出现问题

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/568117

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX