windows - 关于内存转储的问题

标签 windows windbg crash-dumps minidump

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

我想知道为崩溃进程创建内存转储的工作范例。我目前的天马行空的想象如下:

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

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

任何人都可以提供一些引用资料供我开始使用,尤其是在以下方面:

  1. 什么是内存转储?

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

  3. 在 Windows 平台上,我需要哪些 API?会像 MiniDumpWriteDump() 这样的函数吗?相关吗?

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

谢谢你花时间看我的话。


添加1:

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

(6) 当我们谈论内存转储时,我们指的是哪个内存? 虚拟内存 还是物理内存 从这个picture ,我觉得应该是Physical Memory。

添加2:

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

(顺便说一句:我会随着我的进步不断更新这个主题。任何评论都将不胜感激。)

最佳答案

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

关于您的其他问题:

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

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

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

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

关于windows - 关于内存转储的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4075817/

相关文章:

python - 与内置指纹传感器 Python 接口(interface)

Windows 单向链表 (_SINGLE_LIST_ENTRY)

c++ - 如何设置 Windows 符号服务器

c - 微软C库_beginthreadex

ios - Crashlytics 等工具如何工作?他们如何获得/制作崩溃日志?

ios - 了解没有应用程序调用的iOS线程转储

c - WINDOWS 上的 OpenSSL!! - ld.exe 找不到 -lcrypto/-leay32

python - 打印到控制台终端而不是 IPython Notebook 的单元格输出

c - 调试器: How do I get "Mutex Owned" or "Mutex Free" info in a crash dump?

c# - 连接服务不在 VS2013 中?