首頁  >  文章  >  後端開發  >  神秘錯誤:“cgo 參數的 Go 指標指向未固定的 Go 指標”

神秘錯誤:“cgo 參數的 Go 指標指向未固定的 Go 指標”

PHPz
PHPz轉載
2024-02-06 10:48:04609瀏覽

神秘错误:“cgo 参数的 Go 指针指向未固定的 Go 指针”

問題內容

我收到此錯誤,即使在閱讀文件後我也不明白它的意思。事實上,我確實認為我理解了它,但它不適合我發生的方式。互聯網上其他地方似乎也沒有關於此特定問題的其他資訊。

對我來說,它發生在這個函數中(不是我的庫,它似乎在很多地方工作正常,所以這更奇怪)。

為了更好地理解該錯誤,我在本地對其進行了修改,以使 C 函數的每個參數都單獨構造,並查看哪個部分觸發了錯誤:

但事實證明錯誤發生在遊標下的行,所以我認為它完全與 C.lmdbgo_mdb_cursor_get1() 呼叫相關。

我認為該錯誤意味著我將Go 指標傳遞給C 函數,並且可以透過使用unsafe.Pointer() 呼叫包裝Go 指標來解決該錯誤,但這不可能,因為它已經存在完成且相關C 函數的所有參數都已經是C 類型,而不是Go 類型。

更新:經過更多挖掘,我發現實際的panic() 是在/src/runtime/cgocall.go 的第689 行發出的:

因此 cgoIsGoPointer() 傳回 trueisPinned() 傳回 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中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除