2

我目前正在尝试设计一个内存转储工具,可以从另一个进程获取崩溃进程的内存转储。但我对此完全陌生,我想借此机会深入了解内存转储技术。

我想知道为崩溃的进程创建内存转储的工作范例。我现在的疯狂想象如下:

当一个进程崩溃时,操作系统总是会知道(我不知道怎么做,但它应该能够)。然后操作系统启动了某种机制,将崩溃进程的虚拟地址空间的内容复制到所谓的转储文件中。然后我们可以使用 WinDbg 来调试转储文件。

我在想,如果我们可以将崩溃进程的整个虚拟地址空间复制到转储文件中,文件会不会太大?或者我们可以指定转储哪个虚拟地址空间(内核/用户)?

任何人都可以为我提供一些参考,特别是在以下方面:

  1. 什么是内存转储?

  2. 如果有所谓的内核转储和用户模式转储,它们是什么?

  3. 在 Windows 平台上,我需要哪些 API?MiniDumpWriteDump()等函数是否相关?

  4. 当操作系统检测到某个进程崩溃时,是否有任何信号可以监控,以便通知我的转储工具开始转储?

感谢您花时间看我的话。


添加1:

(5) 什么是小型转储?它与内核/用户模式转储有何关系?

(6)当我们谈论内存转储时,我们指的是哪个内存?虚拟内存还是物理内存从这张来看,我认为应该是物理内存。

添加2:

我刚刚找到了关于使用 DbgHelp.dll 中包含的 API 编写 MiniDump的一个很好的参考。我想分享它。如果你能提供其他与此相关的好材料,你介意分享一下吗?谢谢。

顺便说一句:我会根据我的进展不断更新这个线程。任何评论将不胜感激。

4

1 回答 1

6

为什么要自己做这个?已经有很多工具可以做到这一点。Windows 调试工具包括来自 sysinternals的adplus 和ProcDump都可以做到这一点。它们都支持丰富的选择,并且已经过彻底的测试。两者都是免费的。

至于你的其他问题:

1) 内存转储是给定进程的内存空间转储。有各种具有不同细节级别的转储。WinDbg 的帮助文件包含所有详细信息。

2) 对于用户应用程序,您不需要内核转储。内核转储用于调试内核模式代码——即驱动程序和操作系统本身。

3) 您可以使用 dbgeng.dll(包含在 Windows 调试工具中)创建用户模式转储,但正如我所说,您应该首先考虑现有工具。

4) Windows 使用结构化异常处理,因此崩溃基本上是未处理的异常。调试器可以收到第一次和第二次机会异常的通知,因此它们可以在引发异常以及没有异常处理程序可用时创建转储。

于 2010-11-02T08:06:04.433 回答