【问题标题】:MiniDumpWriteDump from another process来自另一个进程的 MiniDumpWriteDump
【发布时间】:2012-12-18 14:21:10
【问题描述】:

我想使用 MiniDumpWriteDump 为我的应用程序生成崩溃日志。 Microsoft 建议从另一个进程执行转储,这是我正在尝试做的。我遇到的问题是将PEXCEPTION_INFORMATION 结构从父进程传递给子进程。问题是父进程拥有这个结构的内存,我需要把它交给孩子。我找到了这篇文章

How do I get at the exception information when using MiniDumpWriteDump out-of-process?

并且接受的答案是 “指针在看门狗进程的上下文中无效并不重要。” 这让我相信我可以简单地传递 PEXCEPTION_INFORMATION 指针我的未处理异常过滤器接收到子进程,Windows 将从父进程读取它。这没有发生,所以我真的不知道该怎么做,此时子进程崩溃,大概是因为 Windows 试图访问这个内存,就好像它属于孩子一样。我显然在这里遗漏了一些东西,但我不确定是什么。我使用管道将数据发送到子进程,上述问题的答案说使用内存映射文件有效,但我不确定为什么,或者我是否正确理解了答案。

【问题讨论】:

  • 那么当您尝试使用内存映射文件时发生了什么?
  • @HansPassant 我没有尝试过,因为我不确定内存映射是什么文件,或者它真的会做什么。
  • @user:对此的任何更新。我正在尝试使用文件映射来做到这一点,但传递异常信息的类似问题。我在这里登陆stackoverflow.com/questions/624691/…,上面写着“如果你使用共享内存,你不能传递指针。指针将包含虚拟地址,这与一个进程不同。你必须交换偏移值,基于共享内存区域的开始。”我被困在中间了。
  • @ananth 我没有深入研究它,也没有找到解决方法。我能想到的唯一方法是对结构进行深层复制,但肯定有更简单的方法。

标签: windows visual-c++ unhandled-exception minidump


【解决方案1】:

调试要转储的进程。

typedef struct _EXCEPTION_POINTERS {
    PEXCEPTION_RECORD ExceptionRecord;
    PCONTEXT ContextRecord;
} EXCEPTION_POINTERS, *PEXCEPTION_POINTERS;

ExceptionRecord 可以通过 WaitforDebugEventEx 从 EXCEPTION_DEBUG_EVENT 中获取。

ContextRecord 可以通过 OpenThread 和 GetThreadContext 以及 DebugEvent 中的 threadid 获取

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-27
    • 2011-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多