首页 > 解决方案 > 在 WinDBG/SOS.DLL 中:如何一次将 !DumpDomain 列出的所有模块/程序集保存到磁盘?

问题描述

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

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

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

这段代码的问题是代码实际上并没有导出所需的 hidden dlls。我认为“for_each_module”不包括来自 !DumpDomain 命令的模块。



任何建议表示赞赏!

标签: c#debuggingwindbgdisassemblysos

解决方案


.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\

推荐阅读