ホームページ  >  記事  >  バックエンド開発  >  Go でのコールバックを使用した MiniDumpWriteDump

Go でのコールバックを使用した MiniDumpWriteDump

王林
王林転載
2024-02-05 23:51:03459ブラウズ

Go 中带有回调的 MiniDumpWriteDump

質問内容

Gocallbacks を使用して MiniDumpWriteDump## を実装しようとしています#。

Call

MiniDumpWriteDump: リーリー

コールバック関数自体: リーリー

タイプ定義: リーリー

コールバックが呼び出され、一部のフィールドは正しいデータを受け取りますが、一部のフィールドは

意味のない 値を受け取ります。

たとえば、上記のコールバックは、

CallbackInputProcessId フィールドを正しく受け取りますが、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 サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。