>  기사  >  백엔드 개발  >  신비한 오류: "cgo 매개변수에 대한 Go 포인터가 고정되지 않은 Go 포인터를 가리킵니다."

신비한 오류: "cgo 매개변수에 대한 Go 포인터가 고정되지 않은 Go 포인터를 가리킵니다."

PHPz
PHPz앞으로
2024-02-06 10:48:04611검색

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

질문 내용

이 오류가 발생하고 설명서를 읽은 후에도 그 의미를 이해할 수 없습니다. 사실, 나는 그것을 이해했다고 생각했지만 그것은 나에게 일어난 방식과 맞지 않았습니다. 인터넷의 다른 곳에서는 이 특정 문제에 대한 다른 정보가 없는 것 같습니다.

저에게는 이 기능에서 이런 일이 발생했습니다(내 라이브러리가 아니라 여러 곳에서 잘 작동하는 것 같아서 이것이 더 이상합니다).

오류를 더 잘 이해하기 위해 C 함수의 각 매개변수가 별도로 구성되고 어떤 부분이 오류를 유발했는지 확인하도록 로컬에서 수정했습니다.

그런데 커서 아래 줄에서 오류가 발생하는 것으로 확인되어 전적으로 C.lmdbgo_mdb_cursor_get1() 호출과 관련이 있는 것으로 생각됩니다.

나는 이 오류가 Go 포인터를 C 함수에 전달하고 Go 포인터를 unsafe.Pointer() 호출로 래핑하여 문제를 해결할 수 있다는 의미라고 생각했지만 이미 완료되었고 모든 인수가 관련 함수에 대한 것이므로 이는 불가능합니다. C 함수는 이미 Go 유형이 아닌 C 유형입니다.

업데이트: 좀 더 조사한 결과 실제 panic() 是在 /src/runtime/cgocall.go의 689행이 발행된 것을 발견했습니다.

따라서 cgoIsGoPointer() 返回 trueisPinned()는 false를 반환합니다.

Go 포인터를 어떻게 "고정"할 수 있나요? 아니면 잘못된 질문인가요?

업데이트: 추가로 조사한 결과 문제를 일으키는 매개 변수가 c.txn.key라는 것을 발견했습니다. 이는 내 제어 범위를 벗어났으며 new(C. MDB_val) . c.txn.key,它超出了我的控制范围,似乎被设置为 new(C. MDB_val)


正确答案


根据https://github.com/PowerDNS/lmdb-go/issues /28 这个问题实际上是由使用 Go new() 构造函数创建 C 指针然后传递给 C 函数引起的。这些应该是使用 C.malloc()

정답

기준 https:// github .com/PowerDNS/lmdb-go/issues /28 이 문제는 실제로 Go new() 생성자를 사용하여 C 포인터를 생성한 다음 이를 C 함수에 전달함으로써 발생합니다. . C.malloc()을 사용하여 생성해야 합니다.

분명히 이 문제는 다른 누구에게도 나타나지 않았는데, 그 이유는 아무도 이 라이브러리를 사용할 때 내가 저지른 것과 같은 실수를 저질렀기 때문입니다. 즉, 여러 고루틴에서 동일한 트랜잭션을 사용하는 것입니다. 이는 LMDB에서 명시적으로 금지합니다(글쎄, LMDB에서는 스레드라고 말하지만 아마도 내 고루틴은 새로운 스레드를 생성합니다). 🎜wojas🎜에 따르면: 🎜

위 내용은 신비한 오류: "cgo 매개변수에 대한 Go 포인터가 고정되지 않은 Go 포인터를 가리킵니다."의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 stackoverflow.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제