我目前正试图devise一个内存转储工具,可以从另一个进程获取崩溃进程的内存转储。 但是我完全不了解这一点,我想以此为契机,深入理解内存转储技术。
我想知道为崩溃进程创build内存转储的工作范式。 我目前疯狂的想象如下:
当一个进程崩溃时,操作系统会一直知道(我不知道如何,但应该可以)。 然后操作系统启动某种机制,将崩溃进程的虚拟地址空间的内容复制到所谓的转储文件。 然后我们可以使用WinDbg来debugging转储文件。
我想知道,如果我们可以将崩溃进程的整个虚拟地址空间复制到转储文件中,文件是不是太大? 或者我们可以指定要转储哪个虚拟地址空间(内核/用户)?
任何人都可以为我提供一些参考资料,特别是在以下方面:
什么是内存转储?
如果有所谓的内核转储和用户模式转储,它们是什么?
在Windows平台上,我需要什么API? 诸如MiniDumpWriteDump()这样的函数是否相关?
当操作系统检测到某个进程崩溃时,是否有任何信号可以监控,以便通知我的转储工具开始转储?
感谢您花时间看我的话。
(5)什么是小型垃圾场? 它与内核/用户模式转储有什么关系?
(6) 当我们谈论内存转储时,我们在谈论什么内存? 虚拟内存或物理内存 ? 从这幅图中我认为应该是物理记忆。
我刚刚发现了一个关于使用包含在DbgHelp.dll中的API编写MiniDump的很好的参考 。 我想分享一下。 如果你能提供其他相关的好材料,你介意分享吗? 谢谢。
( 顺便说一句:我会不断更新这个线程,我的进步,任何意见,将不胜感激。 )
为什么要这样做呢? 有很多工具可以做到这一点。 用于Windows的调试工具包括来自sysinternals的adplus和ProcDump都可以做到这一点。 他们都支持丰富的选择,并已经过彻底的测试。 两者都是免费的。
至于你的其他问题:
1)内存转储是给定进程的内存空间的转储。 有不同级别的细节的各种转储。 WinDbg的帮助文件包含所有的细节。
2)对于用户应用程序,您不需要内核转储。 内核转储用于调试内核模式代码 – 即驱动程序和操作系统本身。
3)您可以使用dbgeng.dll(包含在Windows调试工具中)创建用户模式转储,但正如我所说的,您应该首先考虑现有的工具。
4)Windows使用结构化的异常处理,所以崩溃基本上是一个未处理的异常。 可以通知调试器第一次和第二次机会异常,以便在引发异常时以及没有异常处理程序可用时创建转储。