【问题标题】:How to run .foreach on a managed array addresses in WInDBG?如何在 WInDBG 中的托管数组地址上运行 .foreach?
【发布时间】:2017-08-31 17:28:51
【问题描述】:

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

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

【问题讨论】:

标签: .net windbg


【解决方案1】:

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

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

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

其中 是数组地址, 是要访问的数组项的计数。

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

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

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

【讨论】:

  • 你也可以试试 !sosex.mdt -e:{level}。这将允许您扩展数组,甚至可以查看每个对象的字段。
  • 我需要对每个地址做一定的操作。 .echo 只是一个例子。
猜你喜欢
  • 2015-01-04
  • 2021-11-30
  • 2013-10-13
  • 2010-11-05
  • 1970-01-01
  • 1970-01-01
  • 2012-08-06
  • 1970-01-01
  • 2021-07-18
相关资源
最近更新 更多