[ASP.NET Debugging BuggyBits读书笔记] 预备知识 Part 2

1. dumpstackobjects (!dso)找到当前线程引用的所有的对象。

 

2. !dumparray(!da) 有的对象是数组,比如 System.Object[]类型,此时要查看其内容应该使用 !dumparray命令

 

3. !objsize  无论是使用 !do还是 !da ,如果用于查看数组类型的对象,看到的对象大小是诸如System.Object[]类型的对象大小而未包含其数组元素的大小。此时使用 !objsize 可以查看到数组及其元素的大小。

 

4.  !dumpheap –stat 由于!dumpheap例举出的heap上的对象太多,可以使用 -stat参数使得Debugger仅仅列出heap的统计数据,以及heap上的Method Table以及这个Method Table对应的类型。

在得知了各个Method Table之后,可以使用 !dumpheap –mt MTAddress来得到所有与该Method Table联系的类型的对象实例的情况(MT与类型一一对应,但是一个类型可能有多个实例)

 

5. Dumpheap应用实例:

有一个Web Garden,客户声称使用的是SQL Server来存储的Cache,现在客户遇到了performance问题,但是问题描述相当模糊。对于这种performance问题,首先想到的是cache的问题,但是客户声称并没有使用cache,为了证实这个想法,先从Cache检查起。

!dumpheap –type System.Web.Caching.Cache –stat 这条命令的作用是列出heap的统计数据,以及所有Method table对应的type里面包含有System.Web.Caching.Cache字符串的统计数据。结果如下:

0:050> !dumpheap -type System.Web.Caching.Cache -stat 
------------------------------ 
Heap 0 
total 665 objects 
------------------------------ 
Heap 1 
total 1084 objects 
------------------------------ 
total 1749 objects 
Statistics: 
      MT    Count    TotalSize Class Name 
123056f8        1           12 System.Web.Caching.CacheKeyComparer 
1230494c        1           12 System.Web.Caching.Cache 
1230500c        1           24 System.Web.Caching.CacheMultiple 
1230514c        1           32 System.Web.Caching.CacheMemoryStats 
123053b4        1           36 System.Web.Caching.CacheMemoryTotalMemoryPressure
123059bc        2           40 System.Web.Caching.CacheUsage 
12304bdc        1           48 System.Web.Caching.CacheCommon 
123054f4        1           52 System.Web.Caching.CacheMemoryPrivateBytesPressure 
12305874        2           64 System.Web.Caching.CacheExpires 
12304e64        2          200 System.Web.Caching.CacheSingle 
1255b594       85         1360 System.Web.Caching.CacheDependency+DepFileInfo 
123046c4       40         1440 System.Web.Caching.CacheDependency 
123042ec       47         1504 System.Web.Caching.CacheItemRemovedCallback 
123063fc      832        16640 System.Web.Caching.CacheKey 
12306820      732        52704 System.Web.Caching.CacheEntry 
Total 1749 objects

可见的确有一个Method Table对应的是System.Web.Caching.Cache类型。

现在通过Method Table地址找到所有该Cache类型对应的对象。执行 !dumpheap –mt 1230494c,结果如下:

0:050> !dumpheap -mt 1230494c        
------------------------------ 
Heap 0 
Address       MT     Size 
03392d20 1230494c       12     
total 1 objects 
------------------------------ 
Heap 1 
Address       MT     Size 
total 0 objects 
------------------------------ 
total 1 objects 
Statistics: 
      MT    Count    TotalSize Class Name 
1230494c        1           12 System.Web.Caching.Cache 
Total 1 objects

可见在heap 0上面的确有一个Cache对象,其地址为 03392d20。为了证实Cache比较严重,可以查看该对象的实际大小。执行 !objsize 03392d20,结果如下:

0:050> !objsize 03392d20 
sizeof(03392d20) =    266640828 (   0xfe49dbc) bytes (System.Web.Caching.Cache)

可见该Cache的大小为266640828,即266MB。

此时我们试图找到Cache的具体内容,这里可以从CacheEntry这个类来查找,因此执行 !dumpheap –mt 12306820

0:050> !dumpheap -mt 12306820      
------------------------------ 
Heap 0 
Address       MT     Size 
033950bc 12306820       72     
033a20d8 12306820       72     
033ac79c 12306820       72     
033da21c 12306820       72     
033f04c4 12306820       72     
03428ec8 12306820       72     
0344dab4 12306820       72     
03815d00 12306820       72     
038265d8 12306820       72     
....etc... 
03af7010 12306820       72     
03b291bc 12306820       72     
03b2c674 12306820       72     
03b6dca0 12306820       72     
03b797dc 12306820       72     
03b85318 12306820       72     
03ba9150 12306820       72     
03c258cc 12306820       72     
03de43c8 12306820       72     
03e160f8 12306820       72    
total 382 objects 
------------------------------ 
total 732 objects

可以看到CacheEntry具有732个实例。此时执行 !do 03b2c674,查看其中一个对象的内容:

0:050> !do 03b2c674 
Name: System.Web.Caching.CacheEntry 
MethodTable: 12306820 
EEClass: 122f6470 
Size: 72(0x48) bytes 
(C:\WINDOWS\assembly\GAC_32\System.Web\2.0.0.0__b03f5f7f11d50a3a\System.Web.dll)
Fields: 
      MT    Field   Offset                 Type VT     Attr    Value Name 
02c39310  4001327        4        System.String  0 instance 03b2c600 _key 
0fb8f1f8  4001328        c          System.Byte  0 instance        2 _bits 
0fd3da00  4001329        8         System.Int32  0 instance -1314181915 _hashCode 
02c36ca0  4001330       10        System.Object  0 instance 03b2c644 _value 
120219d0  4001331       1c      System.DateTime  1 instance 03b2c690 _utcCreated
120219d0  4001332       24      System.DateTime  1 instance 03b2c698 _utcExpires 
1202af88  4001333       2c      System.TimeSpan  1 instance 03b2c6a0 _slidingExpiration 
0fb8f1f8  4001334        d          System.Byte  0 instance        7 _expiresBucket 
123062d8  4001335       34 ...g.ExpiresEntryRef  1 instance 03b2c6a8 _expiresEntryRef 
0fb8f1f8  4001336        e          System.Byte  0 instance 4294967295 _usageBucket
12306738  4001337       38 ...ing.UsageEntryRef  1 instance 03b2c6ac _usageEntryRef 
120219d0  4001338       3c      System.DateTime  1 instance 03b2c6b0 _utcLastUpdate 
123046c4  4001339       14 ...g.CacheDependency  0 instance 00000000 _dependency 
02c36ca0  400133a       18        System.Object  0 instance 033d8344 _onRemovedTargets 
120219d0  400132d      1bc      System.DateTime  1   shared   static NoAbsoluteExpiration 
    >> Domain:Value  0019daf0:NotInit  11b42540:03395104 << 
1202af88  400132e      1c0      System.TimeSpan  1   shared   static NoSlidingExpiration 
    >> Domain:Value  0019daf0:NotInit  11b42540:03395114 << 
1202af88  400132f      1c4      System.TimeSpan  1   shared   static OneYear 
    >> Domain:Value  0019daf0:NotInit  11b42540:03395124 <<

此时我们对这个对象里面的Value值比较感兴趣,将Value值拷贝出来,查看他指向的对象的具体内容是什么。执行 !do 03e160c8:

0:000> !do 03e160c8 
Name: System.Web.SessionState.InProcSessionState 
MethodTable: 14dbad5c 
EEClass: 14e43af8 
Size: 48(0x30) bytes 
(C:\WINDOWS\assembly\GAC_32\System.Web\2.0.0.0__b03f5f7f11d50a3a\System.Web.dll)
Fields: 
      MT    Field   Offset                 Type VT     Attr    Value Name 
1466c9d8  4001d89        4 ...ateItemCollection  0 instance 1a7f5438 _sessionItems 
1292672c  4001d8a        8 ...ObjectsCollection  0 instance 00000000 _staticObjects
0fd3da00  4001d8b        c         System.Int32  0 instance       20 _timeout 
120261c8  4001d8c       18       System.Boolean  0 instance        0 _locked 
120219d0  4001d8d       1c      System.DateTime  1 instance 03e160e4 _utcLockDate 
0fd3da00  4001d8e       10         System.Int32  0 instance        1 _lockCookie 
1202bf60  4001d8f       24 ...ReadWriteSpinLock  1 instance 03e160ec _spinLock 
0fd3da00  4001d90       14         System.Int32  0 instance        0 _flags

此时可以发现实际上使用的Session 存储方式是InProc.

你可能感兴趣的:([ASP.NET Debugging BuggyBits读书笔记] 预备知识 Part 2)