【问题标题】:how to get full memory dump of RAM using c#如何使用 C# 获取 RAM 的完整内存转储
【发布时间】:2012-04-29 12:37:18
【问题描述】:

如何使用 C#.NET 获得完整的内存转储?

【问题讨论】:

  • “完整内存转储”是指当前进程的所有内存,当前用户正在运行的进程的所有内存,系统上所有进程的所有内存,还是所有内存包括内核内存?
  • 我已经尝试使用 dbhelp.dll writeminidump 函数,但是它适用于小型转储而不是完整转储。我找不到像这样的另一个 writeCompletexxxxx。正如亚当所问的“完整内存转储”,您是指当前进程的所有内存,当前用户正在运行的进程的所有内存,系统上所有进程的所有内存,还是包括内核内存在内的所有内存? ” 是的,我需要确切的“系统上所有进程的所有内存 + 包括内核内存在内的所有内存”
  • 这是一个完全没有意义的操作,RAM只包含一个进程的一些个完全随机顺序的页面。程序执行时,也会以相当高的速度不断变化。用户模式程序也没有任何方法可以直接访问 RAM。

标签: .net c#-4.0 memory


【解决方案1】:

唯一安全的方法是导致蓝屏并让 Windows 自行获取转储。导致蓝屏是通过KeBugCheckEx 内核函数发生的,您需要一个定制的设备驱动程序以编程方式调用它。或者你可以使用CrashOnCtrlScroll注册技巧并自己触发。

或者您可以使用两台计算机将内核调试器连接到系统并使用.crash debugger 命令触发内存转储。

SysInternals 的 LiveKD 等方法可以在同一台计算机上进行部分内核检查,但它们并不“准确”,因为内存不断变化。使用这些方法不可能获得健康的转储。

使用 C# 做所有这些是毫无意义的。

【讨论】:

    【解决方案2】:

    使用 MiniDumpWriteDump,您可以通过将 DumpType 指定为 MiniDumpWithFullMemory 来获得完整的进程转储。

    您可以尝试通过获取进程句柄列表并使用 MiniDumpWriteDump 对其进行迭代来为系统中的所有进程获取此信息。我不知道您是否会遇到与安全相关的问题。

    至于从用户模式进程中获取内核内存转储,据我所知,这应该是不可能的。

    【讨论】:

    • thks 我之前在上面尝试过,但是写到单独的转储我需要它们一次。有没有一种简单的方法将所有这些合并到一个转储中?
    • 你想要完成什么?
    • 我需要确切的“系统上所有进程的所有内存 + 包括内核内存在内的所有内存”
    猜你喜欢
    • 2019-01-26
    • 1970-01-01
    • 1970-01-01
    • 2018-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-23
    相关资源
    最近更新 更多