2017-08-31 14 views
1

!DumpArrayコマンドに-shortフラグ(!DumpHeapなど)がありません。さて、私はオブジェクトの配列、すなわちアドレスの配列を持っています。 .foreach(または他の方法)を使用して、どのようにすべてを反復処理できますか?WInDBGの管理対象配列アドレスで.foreachを実行する方法は?

おそらく、配列をアンマネージドオブジェクトとして扱うことができます。レイアウトを見つけて、64ビットアドレスが格納されている連続したメモリ部分に移動します。しかし、私は本当に良い方法があることを願っています。

+0

ここでは、手動でそれを行う方法についての説明があります:https://blogs.msdn.microsoft.com/shawnfa/2004/04/30/arrays- and-sos/ –

+0

関連:https://stackoverflow.com/a/25531782/480982 –

答えて

0

64ビットポインタの管理された配列の項目がオフセット0x10から始まることに気がつきました。

ので、アイテムを反復処理するコードは次のようになります。

<アレイアドレス>が配列のアドレスで、 <カウント>は、配列項目のカウントが訪問することである
.foreach /pS1 /ps1 (x {dq /c1 <The Array Address>+0x10 L<Count>}){.echo x } 

私の場合、私は実際に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 [email protected]$t0}){.echo x } 
+0

また、!sosex.mdt -e:{レベル}を試すこともできます。これにより、配列を展開したり、各オブジェクトのフィールドを見ることさえできます。 –

+0

私は各アドレスで特定のアクションを実行する必要があります。 '.echo'は単なる例です。 – mark

関連する問題