Go で callbacks を使用して MiniDumpWriteDump## を実装しようとしています#。
CallMiniDumpWriteDump: リーリー
コールバック関数自体: リーリー
タイプ定義: リーリー
コールバックが呼び出され、一部のフィールドは正しいデータを受け取りますが、一部のフィールドは意味のない 値を受け取ります。
たとえば、上記のコールバックは、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 バイト アライメント ## を使用します。 -bit. #strong> アーキテクチャですが、Go は 64 ビットのデフォルトで 8 バイト アライメントを使用し、それを自動的に変更する方法を提供しません。 解決策は、構造を手動で読み取ることです。以下に実際の例を示します: リーリー
元のコードは、そのパディング (4 バイト) が minidumpapiset.h で使用されるパディングと一致するため、32 ビット アーキテクチャで正常に動作するはずです。以上がGo でのコールバックを使用した MiniDumpWriteDumpの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。