我收到此錯誤,即使在閱讀文件後我也不明白它的意思。事實上,我確實認為我理解了它,但它不適合我發生的方式。互聯網上其他地方似乎也沒有關於此特定問題的其他資訊。
對我來說,它發生在這個函數中(不是我的庫,它似乎在很多地方工作正常,所以這更奇怪)。
為了更好地理解該錯誤,我在本地對其進行了修改,以使 C 函數的每個參數都單獨構造,並查看哪個部分觸發了錯誤:
但事實證明錯誤發生在遊標下的行,所以我認為它完全與 C.lmdbgo_mdb_cursor_get1()
呼叫相關。
我認為該錯誤意味著我將Go 指標傳遞給C 函數,並且可以透過使用unsafe.Pointer()
呼叫包裝Go 指標來解決該錯誤,但這不可能,因為它已經存在完成且相關C 函數的所有參數都已經是C 類型,而不是Go 類型。
更新:經過更多挖掘,我發現實際的panic()
是在/src/runtime/cgocall.go
的第689 行發出的:
因此 cgoIsGoPointer()
傳回 true
且 isPinned()
傳回 false。
到底該怎麼做才能「固定」Go 指標呢?還是這個問題問錯了?
更新:經過進一步挖掘,我發現導致問題的參數是c.txn.key
,它超出了我的控制範圍,似乎被設定為new (C. MDB_val)
。
根據https://github.com/PowerDNS/lmdb-go/issues /28 這個問題其實是由使用Go new()
建構子建立C 指標然後傳遞給C 函數所引起的。這些應該是使用 C.malloc()
建立的。
顯然這個問題從未出現在其他任何人身上,因為沒有人犯過我在使用該庫時犯的同樣錯誤:從多個goroutine 使用相同的事務,這是LMDB 明確禁止的(嗯,LMDB 說線程,但也許我的goroutine 正在產生新線程)。根據 wojas 的說法:
以上是神秘錯誤:'cgo 參數的 Go 指標指向未固定的 Go 指標”的詳細內容。更多資訊請關注PHP中文網其他相關文章!