我目前正在尝试设计一个内存转储工具,它可以从另一个进程获取崩溃进程的内存转储 . 但我对此完全陌生,我想以此为契机,深入了解内存转储技术 .
我想知道为崩溃进程创建内存转储的工作范例 . 我目前的狂野想象如下:
当一个进程崩溃时,操作系统将始终知道(我不知道它应该如何) . 然后,OS启动了某种机制,将崩溃进程的虚拟地址空间的内容复制到所谓的转储文件中 . 然后我们可以使用WinDbg来调试转储文件 .
我想知道,如果我们可以将崩溃进程的整个虚拟地址空间复制到转储文件中,那么文件是不是太大了?或者我们可以指定要转储的虚拟地址空间(内核/用户)吗?
任何人都可以为我提供一些参考资料,特别是在以下方面:
-
什么是内存转储?
-
如果有所谓的内核转储和用户模式转储,它们是什么?
-
在Windows平台上,我需要哪些API?诸如MiniDumpWriteDump()之类的功能是否相关?
-
当操作系统检测到某个进程崩溃时,是否有任何可以监控的信号,以便我的转储工具会被通知开始转储?
谢谢花时间看我的话 .
ADD1:
(5)什么是小型垃圾场?它与内核/用户模式转储有什么关系?
(6) When we talk about memory dump, which memory are we talking about? Virtual Memory or Physical Memory? 从这个picture,我认为应该是物理记忆 .
ADD2:
我刚刚发现了一个很好的reference关于用DbgHelp.dll中包含的API编写MiniDump . 我想分享一下 . 如果您能提供与此相关的其他优质材料,您介意分享吗?谢谢 .
(顺便说一下:我将继续用我的进展更新这个帖子 . 任何评论都会深表赞赏 . )
1 回答
为什么这样做?有很多工具可以做到这一点 . Debugging Tools for Windows包括adplus和来自sysinternals的ProcDump都可以这样做 . 他们都支持丰富的选择,并经过彻底的测试 . 两者都是免费的 .
至于你的其他问题:
1)内存转储是给定进程的内存空间转储 . 有各种不同级别的详细信息转储 . WinDbg的帮助文件包含所有详细信息 .
2)对于用户应用程序,您不需要内核转储 . 内核转储用于调试内核模式代码 - 即驱动程序和操作系统本身 .
3)您可以使用dbgeng.dll(包含在Windows的调试工具中)创建用户模式转储,但正如我所说,您应该首先考虑现有工具 .
4)Windows使用结构化异常处理,因此崩溃基本上是一个未处理的异常 . 可以向调试器通知第一次和第二次机会异常,因此它们可以在引发异常时以及没有可用的异常处理程序时创建转储 .