在Go程序中获取C代码堆栈跟踪

在Go程序中获取C代码堆栈跟踪,go,Go,我在Go程序中使用oracle驱动程序来查询一些oracle表 程序在运行一段时间后总是从C库中获取SIGSEGV,并在SEGFULT上退出。在遇到segfault错误之前,它还获得了大量查询超时(上下文截止日期已超过) 我以非常标准的方式使用驱动程序: ctx, cancel := context.WithTimeout(context.Background(), 10*time.Seconds) defer cancel() rows, err := initialedDb.QueryCon

我在Go程序中使用oracle驱动程序来查询一些oracle表

程序在运行一段时间后总是从C库中获取SIGSEGV,并在SEGFULT上退出。在遇到segfault错误之前,它还获得了大量查询超时(
上下文截止日期已超过

我以非常标准的方式使用驱动程序:

ctx, cancel := context.WithTimeout(context.Background(), 10*time.Seconds)
defer cancel()
rows, err := initialedDb.QueryContext(ctx, "sql_query")
来自第一个Goroutine的堆栈跟踪是:

fatal error: unexpected signal during runtime execution
[signal SIGSEGV: segmentation violation code=0x1 addr=0x70 pc=0x7fbb03e5d193]
runtime stack:
runtime.throw(0xa4a0a4, 0x2a)
    /usr/local/go/src/runtime/panic.go:596 +0x95
runtime.sigpanic()
    /usr/local/go/src/runtime/signal_unix.go:274 +0x2db
goroutine 5230 [syscall, locked to thread]:
runtime.cgocall(0x921850, 0xc421667348, 0xa495f1)
    /usr/local/go/src/runtime/cgocall.go:131 +0xe2 fp=0xc421667308 sp=0xc4216672c8
gopkg.in/rana/ora%2ev4._Cfunc_OCIAttrGet(0x2c92f08, 0x35, 0xc421cb8be4, 0xc421cb8be8, 0x5, 0x2b81930, 0xc400000000)
    gopkg.in/rana/ora.v4/_obj/_cgo_gotypes.go:347 +0x4d fp=0xc421667348 sp=0xc421667308
gopkg.in/rana/ora%2ev4.(*Rset).paramAttr.func1(0x2c92f08, 0xc400000035, 0xc421cb8be4, 0xc421cb8be8, 0x5, 0x2b81930, 0xf1ef01)
    /go/src/gopkg.in/rana/ora.v4/rset.go:970 +0xfc fp=0xc421667390 sp=0xc421667348
gopkg.in/rana/ora%2ev4.(*Rset).paramAttr(0xc4211f22d0, 0x2c92f08, 0xc421cb8be4, 0xc421cb8be8, 0xc400000005, 0x0, 0x0)
    /go/src/gopkg.in/rana/ora.v4/rset.go:976 +0x88 fp=0xc4216673e0 sp=0xc421667390
gopkg.in/rana/ora%2ev4.(*Rset).open(0xc4211f22d0, 0xc421358000, 0x7fbae405ed28, 0x0, 0x0)
    /go/src/gopkg.in/rana/ora.v4/rset.go:554 +0xd43 fp=0xc421667b98 sp=0xc4216673e0
gopkg.in/rana/ora%2ev4.(*Stmt).qryC(0xc421358000, 0xf1e940, 0xc421ace900, 0xc421cb8ad0, 0x1, 0x1, 0xc4211f22d0, 0x0, 0x0)
    /go/src/gopkg.in/rana/ora.v4/stmt.go:442 +0x3e0 fp=0xc421667f18 sp=0xc421667b98
gopkg.in/rana/ora%2ev4.(*DrvStmt).QueryContext.func1(0xc421b73260, 0xc420e789e8, 0xc420e789e0, 0xf1e940, 0xc421ace900, 0xc421cb8ad0, 0x1, 0x1)
    /go/src/gopkg.in/rana/ora.v4/drvStmt_go1_8.go:76 +0xa6 fp=0xc421667fa0 sp=0xc421667f18
runtime.goexit()
    /usr/local/go/src/runtime/asm_amd64.s:2197 +0x1 fp=0xc421667fa8 sp=0xc421667fa0
created by gopkg.in/rana/ora%2ev4.(*DrvStmt).QueryContext
    /go/src/gopkg.in/rana/ora.v4/drvStmt_go1_8.go:82 +0x30c
我检查了我的程序很多次,我不认为我造成了任何内存泄漏,双重释放或类似的事情


我想知道如何调试它,因为Go没有给我C的堆栈跟踪。Valgrind的Memcheck工具有用吗?

我想知道您最近是否遇到了修复问题。此外,完整的堆栈跟踪是否表明垃圾收集器可能参与其中?@Mark我认为这很有可能。需要一段时间look@Mark这似乎解决了我的问题。你知道他们多久会将master合并到1.8版本分支中?@JFreebird:master不会合并到旧版本分支中,它是下一个版本。您可以轻松地从源代码构建Go,并查看它是否解决了您的问题。还要确保您已经从ora.v4包中提取了最新的提交。还要确保您没有使用
GODEBUG=cgocheck=0
,因为这些错误可能是由cgo中不正确使用Go指针引起的。问题是我正在Docker中运行它。我只是用Go的docker官方形象。我的本地计算机没有编译程序的环境。我认为自己要把Go打造成docker形象并不容易。