在 WinDBG/SOS.DLL 中:如何将 !DumpDomain 列出的所有 modules/assemblies 一次保存到磁盘?

In WinDBG/SOS.DLL: How can I save all modules/assemblies listed by !DumpDomain to disk at once?

我有一个应用程序在运行时通过 memorystream 动态加载一堆 dlls。使用 WinDBG 我可以在使用命令 !DumpDomain 时看到加载的模块。使用其他命令 (like ! lm) 不会 show/list 这些隐藏的 dlls

现在我想使用 !SaveModule [ModuleNumber from !DumpDomain list] 命令将这些 dlls 保存到磁盘。它工作得很好,但问题是我必须为每个模块手动完成。我想自动化这个过程,发现下面的代码:

!for_each_module .if ($spat ("${@#ImageName}","*.exe")) { !SaveModule ${@#Base} c:\temp${@#ModuleName}.exe } .else { !SaveModule ${@#Base} c:\temp${@#ModuleName}.dll }

此代码的问题在于代码实际上并未导出所需的隐藏 dlls。我认为这与 "for_each_module" 不包含来自 !DumpDomain 命令的模块有关。



感谢任何建议!

.NET 模块未与 lm 一起列出,因此它不在 .for_each_module

为了保存托管模块,请执行以下操作:

  1. 获取 NetExt 扩展:https://github.com/rodneyviana/netext/releases

  2. 使用 !wmodule 命令:https://github.com/rodneyviana/netext#wmodule

!wmodule -managed -saveto c:\temp\

为避免保存 Microsoft 模块(如 System.Web.dll),请改用此命令:

!wmodule -managed -noms -saveto c:\temp\