如何使用Windbg转储特定的内存段



我正在调试一个内核应用程序,并希望转储内存的特定部分。我想在特定点中断后将驱动程序(即其PE标头及其所有部分(复制到转储文件中。我曾尝试使用常规内存转储并删除不相关的部分,但奇怪的是,内核转储似乎将PE文件分散在一个300mb的大转储中,这对我来说基本上没有用。有没有办法使用Windbg转储一段内存,或者可能写一个扩展来添加这些功能?

(本应为注释,但有点太长(

在一个完美的世界中,最简单的方法是执行lmvm <driver_name>(请参见lm命令(,查看驱动程序映射的基础和结尾,然后在映射范围上执行.writemem

遗憾的是,一些驱动程序部分是可丢弃的(当控制流到达条目时,它们被映射,但通常在DriverEntry执行之后,它们将被取消映射(,而其他部分将在驱动程序的生命周期内被系统调出(写入磁盘((并在页面故障的情况下被映射回(。此外,如果(iirc(.writemem不能读取内存范围的一部分,则它将完全失败。

你最好的选择是在入口点转储驱动程序(我认为Windows不会懒惰地加载驱动程序部分(。

从技术上讲,你可以循环所有页面,如果缺少一个页面,你可以尝试.pagein丢失的块,但它有时也会失败(没有任何方法知道原因(。。。

.pagein非常麻烦,因为你要求一个页面范围,这样调试器就可以从磁盘上对请求的内存进行分页,但你也需要运行系统(.pagein后面需要一个g(,这样调试器可以要求文件系统驱动程序堆栈实际将页面返回到内存中。在此期间,系统运行。。。

如果你在内存转储上这样做,你显然不能.pagein,所以它不起作用;你需要一个实时系统。

最新更新