Wie wird der Array-Typ identifiziert?

Ich habe eine OutOfMemoryException und möchte die Größe und den Typ des Arrays analysieren, das erstellt werden soll.

Ich habe einen Demo-Zweck-Dump für diese Situation erstellt und kann die folgenden Informationen abrufen:

0:000> !pe
Exception object: 023f389c
Exception type: System.OutOfMemoryException
Message: <none>
InnerException: <none>
StackTrace (generated):
    SP       IP       Function
    0015EE44 0099007F OOM2!OOM2.Program.Main()+0xf

StackTraceString: <none>
HResult: 8007000e

0:000> !u 0099007F 
Normal JIT generated code
OOM2.Program.Main()
Begin 00990070, size 22
00990070 baffffff7f      mov     edx,7FFFFFFFh
00990075 b90241a478      mov     ecx,offset mscorlib_ni+0x4102 (78a44102)
0099007a e8192194ff      call    002d2198 (JitHelp: CORINFO_HELP_NEWARR_1_VC)
>>> 0099007f 8bc8            mov     ecx,eax
...

So kann ich sehen, dass ein neues Array erstellt wird und die Größe 7FFFFFFF ist, was 2 Milliarden Elementen entspricht. (Bitte ignorieren Sie die Tatsache, dass Sie nicht einmal ein Byte [] dieser Größe in einer 32-Bit-.NET-Anwendung erstellen können. In diesem Beispiel würde der Typ also wahrscheinlich überhaupt keine Rolle spielen.)

Ich habe jetzt gelesen, dass der Typ des Arrays im ECX-Register steht, aber leidermscorlib_ni+0x4102 (78a44102) ist nicht sehr hilfreich.

Ich habe versucht!mln, !mdt und sogar unrealistisch!ip2mt, aber keiner von ihnen zeigt das erwartete @ byte oderbyte[] Ausgabe. Gibt es eine Möglichkeit, den Typ aus dem nativen Image von mscorlib zu ermitteln?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage