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 上,发生了死锁。