Go에서 callbacks을 사용하여 MiniDumpWriteDump를 구현하려고 합니다.
전화 MiniDumpWriteDump:
으아아아콜백함수 자체:
으아아아Type정의:
으아아아콜백이 호출되고 일부 필드는 올바른 데이터를 받지만 일부 필드는 의미없는 값을 받습니다.
예를 들어 위의 콜백은 CallbackInput의 ProcessId 필드를 올바르게 수신하지만, 필요한 경우 CallbackType MINIDUMP_CALLBACK_TYPE 열거형으로 임의의 정수를 수신합니다.
출력:
callback := syscall.NewCallback(miniDumpCallback) var newCallbackRoutine MINIDUMP_CALLBACK_INFORMATION newCallbackRoutine.CallbackParam = 0 newCallbackRoutine.CallbackRoutine = callback ret, _, err := miniDumpWriteDump.Call( uintptr(processHandle), uintptr(processId), uintptr(dumpFile), uintptr(options), 0, 0, uintptr(unsafe.Pointer(&newCallbackRoutine)), )
댓글에서 알 수 있듯이 문제는 구조적 정렬에 있습니다.
@IInspectable이 설명했듯이 MiniDumpWriteDump 함수와 MINIDUMP_CALLBACK_INPUT 구조를 내보내는 minidumpapiset.h는 32비트 및 64비트 아키텍처 모두에 대해 4바이트 정렬 Strong>을 사용하는 반면 Go는 64비트 아키텍처를 사용합니다. 비트는 기본적으로 8바이트 정렬이며 이를 변경하는 자동 방법을 제공하지 않습니다.
해결책은 구조를 수동으로 읽는 것입니다. 다음은 실제 예입니다:
으아아아원본 코드는 패딩(4바이트)이 minidumpapiset.h에서 사용되는 패딩과 일치하므로 32비트 아키텍처에서 제대로 작동해야 합니다.
위 내용은 Go의 콜백이 포함된 MiniDumpWriteDump의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!