iis服务器助手广告
返回顶部
首页 > 资讯 > 精选 >Go 中带有回调的 MiniDumpWriteDump
  • 487
分享到

Go 中带有回调的 MiniDumpWriteDump

2024-02-06 05:02:17 487人浏览 独家记忆
摘要

问题内容 我正在尝试在 Go 中使用 回调 实现 MiniDumpWriteDump。 调用MiniDumpWriteDump: callback := syscall.NewCall

问题内容

我正在尝试在 Go 中使用 回调 实现 MiniDumpWriteDump

调用MiniDumpWriteDump

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)),
    )

回调函数本身:

func miniDumpCallback(_ uintptr, CallbackInput *MINIDUMP_CALLBACK_INPUT, _ uintptr) uintptr {
    fmt.Println(CallbackInput.ProcessId, CallbackInput.CallbackType)
    return 1
}

类型定义:

type MINIDUMP_CALLBACK_INPUT struct {
    ProcessId     win32.ULONG
    ProcessHandle win32.HANDLE
    CallbackType  win32.ULONG
    CallbackInfo  uintptr
}

type MINIDUMP_CALLBACK_INFORMATION struct {
    CallbackRoutine uintptr
    CallbackParam   uintptr
}

回调被调用,一些字段收到正确的数据,但一些字段得到无意义值。

例如,上面的回调正确接收 CallbackInputProcessId 字段,但在应该接收时接收随机整数作为 CallbackType MINIDUMP_CALLBACK_TYPE 枚举。

输出:

12544 0
12544 1133445120
12544 12548
12544 13028
12544 1114112
12544 1023344640
12544 999620608
12544 990117888
12544 992542720
12544 1005518848
12544 1994850304
12544 1114112
12544 1994915840


正确答案


正如评论所建议的,问题出在结构对齐上。

正如 @IInspectable 所解释的,导出 MiniDumpWriteDump 函数和 MINIDUMP_CALLBACK_INPUT 结构的 minidumpapiset.h 对 32 位64 位都使用 4 字节 对齐方式 strong> 架构,而 Go 默认情况下为 64 位使用 8 字节 对齐方式,并且不提供自动更改它的方法。

解决方案是手动读取结构体。这是一个工作示例:

type MINIDUMP_CALLBACK_INPUT struct {
ProcessId     uint32
ProcessHandle uintptr
CallbackType  uint32
CallbackInfo uintptr}

func ptrToMinidumpCallbackInput(ptrCallbackInput uintptr) MINIDUMP_CALLBACK_INPUT{
    var input MINIDUMP_CALLBACK_INPUT
    input.ProcessId = *(*uint32)(unsafe.Pointer(ptrCallbackInput))
    input.ProcessHandle = *(*uintptr)(unsafe.Pointer(ptrCallbackInput + unsafe.Sizeof(uint32(0))))
    input.CallbackType = *(*uint32)(unsafe.Pointer(ptrCallbackInput + unsafe.Sizeof(uint32(0)) + unsafe.Sizeof(uintptr(0))))
    input.CallbackInfo = *(*uintptr)(unsafe.Pointer(ptrCallbackInput + unsafe.Sizeof(uint32(0)) + unsafe.Sizeof(uintptr(0)) + unsafe.Sizeof(uint32(0))))
    return input}

原始代码应该可以在 32 位架构上正常工作,因为它的填充(4 字节)与 minidumpapiset.h 使用的填充相匹配。

以上就是Go 中带有回调的 MiniDumpWriteDump的详细内容,更多请关注编程网其它相关文章!

--结束END--

本文标题: Go 中带有回调的 MiniDumpWriteDump

本文链接: https://www.lsjlt.com/news/561263.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Go 中带有回调的 MiniDumpWriteDump
    问题内容 我正在尝试在 Go 中使用 回调 实现 MiniDumpWriteDump。 调用MiniDumpWriteDump: callback := syscall.NewCall...
    99+
    2024-02-06
  • Go 中如何返回带有参数的函数?
    从现在开始,努力学习吧!本文《Go 中如何返回带有参数的函数?》主要讲解了等等相关知识点,我会在编程网中持续更新相关的系列文章,欢迎大家关注并积极留言建议。下面就先一起来看一下本篇正文内容吧,希望能...
    99+
    2024-04-04
  • GO语言中回调函数的使用
    目录0.前言1.使用2.几个例子2.1 异步访问URL2.2 Sort.Slice函数2.3 简易计算器0.前言 回调函数是一种在编程中常见的技术,通常在异步编程中使用。简单来说,回...
    99+
    2023-03-06
    GO语言回调函数 GO 回调
  • 从 Rust 到 Go 的回调函数
    问题内容 我正在尝试创建从 go 调用 rust 函数的可能性,然后所述 rust 函数将函数回调到 go。我使用 cgo 作为 go 和 rust 之间的 ffi 接口。 以下是我的...
    99+
    2024-02-06
    typedef
  • GO语言中的回调函数如何使用
    这篇文章主要介绍了GO语言中的回调函数如何使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇GO语言中的回调函数如何使用文章都会有所收获,下面我们一起来看看吧。0.前言回调函数是一种在编程中常见的技术,通常在异...
    99+
    2023-07-05
  • JavaScript 中回调函数有哪些
    这期内容当中小编将会给大家带来有关JavaScript 中回调函数有哪些,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。什么是函数函数是在其中有一组代码的逻辑构件,用来执行...
    99+
    2024-04-02
  • Java带参数与带返回值的方法的定义和调用
    目录带参数方法的定义和调用形参和实参带参数方法练习带返回值的方法的定义和调用带返回值的方法定义带返回值的方法调用带参数方法的定义和调用 形参和实参 形参:方法定义中的参数  ...
    99+
    2024-04-02
  • JavaScript如何禁用回调列表中的回调
    本篇内容介绍了“JavaScript如何禁用回调列表中的回调”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!...
    99+
    2024-04-02
  • 轻量应用服务器带宽调整怎么调回来的
    如果您在使用轻量应用服务器的过程中发现流量突然变得很大,您可以尝试以下步骤以重新获得所需的带宽: 检查网络流量:您可以检查一下您的网络连接是否正常,查看流量计的读数是否正确。您可以尝试将流量计关闭并等待一段时间再重新打开,或者更换另一个...
    99+
    2023-10-26
    带宽 服务器
  • js中可选的回调函数有哪些
    这篇文章主要为大家展示了“js中可选的回调函数有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“js中可选的回调函数有哪些”这篇文章吧。1、then的回调函数不是严格要求必写的。如果不写,pr...
    99+
    2023-06-25
  • JavaScript中回调函数的内容有哪些
    这篇文章将为大家详细讲解有关JavaScript中回调函数的内容有哪些,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。回调函数是每个 JS 开发人员都应该知道...
    99+
    2024-04-02
  • 轻量应用服务器带宽调整怎么调回来的啊
    如果您想要轻量应用服务器提供足够的带宽来满足应用程序的需求,您可以通过以下几个步骤来完成: 查看流量趋势:您可以检查应用程序的流量趋势,并根据流量趋势调整应用程序的带宽限制。 限制网络带宽:如果您想要限制网络带宽,您可以考虑使用流量限制...
    99+
    2023-10-26
    带宽 服务器
  • JS中promise的回调和setTimeout的回调哪个先执行
    这篇文章将为大家详细讲解有关JS中promise的回调和setTimeout的回调哪个先执行,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。首先提一个小问题:运行下面这段 JS 代码后控制台的输出是什么?c...
    99+
    2023-06-29
  • 编程中的回调函数有什么作用
    本篇内容主要讲解“编程中的回调函数有什么作用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“编程中的回调函数有什么作用”吧!不知你是不是也有这样的疑惑,我们为什么...
    99+
    2024-04-02
  • Java带参数与带返回值的方法怎么定义和调用
    这篇文章主要介绍“Java带参数与带返回值的方法怎么定义和调用”,在日常操作中,相信很多人在Java带参数与带返回值的方法怎么定义和调用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java带参数与带返回值的...
    99+
    2023-06-29
  • 带有 Go 泛型的单例模式
    问题内容 我正在尝试找出在 golang 中为泛型变量实现单例的最不糟糕的方法。使用普通的 sync.once 模式与全局变量是行不通的,因为通用类型信息在那里不可用(如下)。 这个示...
    99+
    2024-02-06
  • Java多线程之 FutureTask:带有返回值的函数定义和调用方式
    FutureTask 返回值的函数定义和调用 使用Runnable接口定义的任务是没有返回值的。很多时候,我们是有返回值的,为了解决这个问题,Java提供了Callable接口,可以...
    99+
    2024-04-02
  • Go服务器未在后续REST调用中返回Cookie
    IT行业相对于一般传统行业,发展更新速度更快,一旦停止了学习,很快就会被行业所淘汰。所以我们需要踏踏实实的不断学习,精进自己的技术,尤其是初学者。今天编程网给大家整理了《Go服务器未在后续REST调...
    99+
    2024-04-04
  • Java带返回值的方法的定义和调用详解
    目录带返回值的方法练习方法的注意事项方法注意事项方法通用格式带返回值的方法练习 需求: 设计一个方法可以获取两个数的较大值,数据来自于参数 思路: 1. 定义一个方法,用于获取两个数...
    99+
    2024-04-02
  • 一篇文章带你了解C/C++的回调函数
    目录函数指针概念先来看一个Hello World程序然后,采用函数调用的形式来实现用函数指针的方式来实现函数指针数组回调函数概念标准Hello World程序将它修改成函数回调样式修...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作