如何在WInDBG中的托管数组地址上运行.foreach?

时间:2017-08-31 17:28:51

标签: .net windbg

!DumpArray命令没有像!DumpHeap这样的 -short 标记。现在,我有一个对象数组,即一组地址。如何使用.foreach(或任何其他方式)迭代所有这些?

我可以将数组视为非托管对象 - 找出布局并进入存储64位地址的连续内存部分。但我真的希望有更好的方法。

1 个答案:

答案 0 :(得分:0)

我最终注意到64位指针的托管数组的项目从偏移量0x10开始。

因此,迭代项目的代码将是:

.foreach /pS1 /ps1 (x {dq /c1 <The Array Address>+0x10 L<Count>}){.echo x }

&lt;数组地址&gt; 是数组地址,&lt; Count&gt; 是要访问的数组项的数量。

就我而言,我实际上处理的是List<T>个对象。它包含偏移量为8的数组引用(_items)和偏移量为0x18(_size)的项目数

因此,给定X List<T>对象的地址,其中T是64位系统中的引用类型,我们可以像这样迭代列表中的项:

r @$t0 = wo(X+0x18)
.foreach /pS1 /ps1 (x {dq /c1 poi(X+8)+0x10 L@$t0}){.echo x }