cgo报错:‘cgo argument has Go pointer to unpinned Go pointer’排查求助
关于cgo报错“cgo argument has Go pointer to unpinned Go pointer”的排查与疑问
我遇到了报错cgo argument has Go pointer to unpinned Go pointer,即便阅读了官方的cgocall.go源码也无法理解其含义;原本以为自己理解了报错逻辑,但实际报错情况和我的认知不符,且网上几乎找不到相关问题的参考信息。
该报错出现在lmdb-go库的cursor.go文件第199-207行的函数中(该库并非由我开发,且在多数场景下运行正常,这让问题更显困惑)。
为了定位问题,我在本地修改代码,将传给C函数的每个参数单独构造,以此排查触发报错的部分:
排查结果显示报错出现在cursor对应的行,我认为这与C.lmdbgo_mdb_cursor_get1()的调用本身相关。
我原本以为该报错意味着向C函数传递了未包装的Go指针,只需用unsafe.Pointer()包装即可解决,但实际并非如此——代码中已经使用了该包装方法,且传给该C函数的所有参数均为C类型而非Go类型。
更新1:进一步排查后确认,实际的panic()触发于/src/runtime/cgocall.go的第689行:
即cgoIsGoPointer()返回true,而isPinned()返回false。
到底该如何“固定(pin)”Go指针?或者我的这个问题本身就存在认知错误?
更新2:再次排查发现,引发问题的参数是c.txn.key,该参数不受我控制,且似乎被设置为new(C.MDB_val)。
内容的提问来源于stack exchange,提问作者fiatjaf
相关产品推荐
相关产品推荐

