The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
fengjianxinghun

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

  •  
  •   fengjianxinghun · May 27, 2019 · 3814 views
    This topic created in 2542 days ago, the information mentioned may be changed or developed.

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

    4 replies    2019-05-28 12:27:09 +08:00
    kofj
        1
    kofj  
       May 27, 2019
    还能这么玩儿,mark 一下
    chennqqi
        2
    chennqqi  
       May 28, 2019
    把 -ldflags "-w -s" 去掉就有符号了,挂上去调试吧
    icexin
        3
    icexin  
       May 28, 2019
    fork+多线程会有很多 bug
    juzipeek
        4
    juzipeek  
       May 28, 2019
    reload 时动态是否有变化,如果有变化容易出现问题
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3333 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 60ms · UTC 13:12 · PVG 21:12 · LAX 06:12 · JFK 09:12
    ♥ Do have faith in what you're doing.