rodneyviana / netext

WinDbg extension for data mining managed heap. It also includes commands to list http request, wcf services, WIF tokens among others
http://blogs.msdn.microsoft.com/rodneyviana
Other
224 stars 35 forks source link

"Unable to read 0x4 bytes at 00000000" for !wconcurrentdict #14

Open vladimir-cheverdyuk-altium opened 4 years ago

vladimir-cheverdyuk-altium commented 4 years ago

I have 32 bit dump that was taken on 64 bit machine using 32 bit task manager. Everything works fine except !wconcurrentdict

I got this error: ERROR: !wconcurrentdict: extension exception 0x80004002. "Unable to read 0x4 bytes at 00000000"

I tried few different ConcurrentDictionary's and I always got the same error. I was able to check them via Windbg using standard SOS. I can check m_tables, m_buckets and m_countPerLock without any problem. It just very time consuming.

0:000> !wconcurrentdict 0f2d0d78
ERROR: !wconcurrentdict: extension exception 0x80004002.
    "Unable to read 0x4 bytes at 00000000"
0:000> !DumpObj 0f2d0d78
Name:        System.Collections.Concurrent.ConcurrentDictionary`2[[System.String, mscorlib],[System.Collections.Generic.List`1[[Class1, Class2]], mscorlib]]
MethodTable: 2bd92734
EEClass:     25b588e0
Size:        40(0x28) bytes
File:        C:\Windows\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll
Fields:
      MT    Field   Offset                 Type VT     Attr    Value Name
25bcb014  4001851        4 ...Canon, mscorlib]]  0 instance a5ea01d0 m_tables
24aca40c  4001852        8 ...Canon, mscorlib]]  0 instance 00000000 m_comparer
0895c068  4001853       20       System.Boolean  1 instance        1 m_growLockArray
0895dfd0  4001854       10         System.Int32  1 instance        0 m_keyRehashCount
0895dfd0  4001855       14         System.Int32  1 instance       17 m_budget
2672dcec  4001856        c ...non, mscorlib]][]  0 instance 00000000 m_serializationArray
0895dfd0  4001857       18         System.Int32  1 instance        0 m_serializationConcurrencyLevel
0895dfd0  4001858       1c         System.Int32  1 instance        0 m_serializationCapacity
0895c068  400185b        8       System.Boolean  1   static  <no information>
0:000> !DumpObj /d a5ea01d0
Name:        System.Collections.Concurrent.ConcurrentDictionary`2+Tables[[System.String, mscorlib],[System.Collections.Generic.List`1[[Class1, Class2]], mscorlib]]
MethodTable: 2bd92d5c
EEClass:     25b596e0
Size:        24(0x18) bytes
File:        C:\Windows\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll
Fields:
      MT    Field   Offset                 Type VT     Attr    Value Name
00000000  400349c        4              SZARRAY  0 instance a5ea42a8 m_buckets
0895b8ac  400349d        8      System.Object[]  0 instance 1a2d1318 m_locks
24b4bd14  400349e        c       System.Int32[]  0 instance a5eb5aa8 m_countPerLock
24aca40c  400349f       10 ...Canon, mscorlib]]  0 instance 14276e00 m_comparer
0:000> !DumpObj /d a5ea42a8
Name:        System.Collections.Concurrent.ConcurrentDictionary`2+Node[[System.String, mscorlib],[System.Collections.Generic.List`1[[Class1, Class2]], mscorlib]][]
MethodTable: 2bd92c94
EEClass:     0895b844
Size:        71680(0x11800) bytes
Array:       Rank 1, Number of elements 17917, Type CLASS (Print Array)
Fields:
None
0:000> !DumpObj /d a5eb5aa8
Name:        System.Int32[]
MethodTable: 24b4bd14
EEClass:     24b4bcb8
Size:        4108(0x100c) bytes
Array:       Rank 1, Number of elements 1024, Type Int32 (Print Array)
Fields:
None
rodneyviana commented 4 years ago

I did not write !wconcurrentdict, it was a contribution. I tested on a few dumps and it worked but I did not do a thorough test. Do you have any particular steps to reproduce it from scratch? I will try to create a concurrent dictionary but I am not sure of the exact types. By the dump output it looks like ConcurrentDict<String, List<<Class1, Class2>> which looks like a compiler generated dictionary.

vladimir-cheverdyuk-altium commented 4 years ago

Hi. Sorry I don't have any particular steps. I had 32 bit dump and I was trying to see content. ConcurrentDictionary<String, List<<Class1, Class2>> is not compiler generated. It is in our code as static field with. I just replaced real class names to Class1 and Class2. I did try to use this command on different ConcurrentDictionary and it also does not work. I hope it helps :)