在 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 命令的模块有关。
有人对此有解决方案吗?或者
是否有更好的方法将 dlls
保存到磁盘?
感谢任何建议!
.NET 模块未与 lm 一起列出,因此它不在 .for_each_module
中
为了保存托管模块,请执行以下操作:
获取 NetExt 扩展:https://github.com/rodneyviana/netext/releases
使用 !wmodule 命令:https://github.com/rodneyviana/netext#wmodule
!wmodule -managed -saveto c:\temp\
为避免保存 Microsoft 模块(如 System.Web.dll),请改用此命令:
!wmodule -managed -noms -saveto c:\temp\
我有一个应用程序在运行时通过 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 命令的模块有关。
有人对此有解决方案吗?或者
是否有更好的方法将
dlls
保存到磁盘?
感谢任何建议!
.NET 模块未与 lm 一起列出,因此它不在 .for_each_module
中为了保存托管模块,请执行以下操作:
获取 NetExt 扩展:https://github.com/rodneyviana/netext/releases
使用 !wmodule 命令:https://github.com/rodneyviana/netext#wmodule
!wmodule -managed -saveto c:\temp\
为避免保存 Microsoft 模块(如 System.Web.dll),请改用此命令:
!wmodule -managed -noms -saveto c:\temp\