问题简介

ASP.NET应用中, 每一访问者都会单独获得一个Session。在Web应用程序中,当一个用户访问该应用时,Session类型的变量可以供这个用户在该Web应用的所有页面中共享数据;如果另一个用户也同时访问该Web应用,他也拥有自己的Session变量,但两个用户之间无法通过Session变量共享信息.很多时候在生产环境中调试需要从dump中分析session中的特定数据, 我们可以从HttpContext对象上找到与这个请求有关的用户Session.以下是从dump中分析查找session中存储对象的一般步骤。

查找方法

通过ILSPY反编译HttpContext.Current.Session. 发现Session是一个HttSessionState类型的对象, 保存在HttpContext.Items中, Key值为AspSession. 要找到Session对象, 需要先从DUMP中找到HttpContext的Items对象, 并从这个Hashtable中找到AspSession.

1. 加载 sos.dll

.load C:\Windows\Microsoft.NET\Framework64\v2.0.50727\sos.dll

2. 定位到需要关注的线程, 找到当前的HttpContext

0:027> !dso
OS Thread Id: 0x2d8c (27)
RSP/REG          Object           Name
……
0000001a05fee8d0 00000019043a3328 System.Web.HttpContext
……

3. 首先需要找到items的地址. 在items中找到buckets的地址. 用命令 !da –details <address>将里面的元素列出来, 找到key为"AspSession", 它所保存的value就是Session对象.

0:027> !do 00000019043a3328 
Name: System.Web.HttpContext
MethodTable: 000007f9e9294ac0
EEClass: 000007f9e8ef2428
Size: 336(0x150) bytes
 (C:\Windows\assembly\GAC_64\System.Web\2.0.0.0__b03f5f7f11d50a3a\System.Web.dll)
Fields:
              MT    Field   Offset                 Type VT     Attr            Value Name
000007f9e92975e8  4000fe6        8 ...IHttpAsyncHandler  0 instance 0000000000000000 _asyncAppHandler
000007f9e9297118  4000fe7       10 ...b.HttpApplication  0 instance 00000019043a66c8 _appInstance
000007f9e9297658  4000fe8       18 ....Web.IHttpHandler  0 instance 000000190441fcd0 _handler
000007f9e9297a98  4000fe9       20 ...m.Web.HttpRequest  0 instance 00000019043a3478 _request
000007f9e9297e18  4000fea       28 ....Web.HttpResponse  0 instance 00000019043a35c8 _response
000007f9e9298330  4000feb       30 ...HttpServerUtility  0 instance 00000018c43e2188 _server
000007fa22e711c0  4000fec       38 ...Collections.Stack  0 instance 0000000000000000 _traceContextStack
000007f9e929d698  4000fed       40 ....Web.TraceContext  0 instance 0000000000000000 _topTraceContext
000007fa22e7f578  4000fee       48 ...ections.Hashtable  0 instance 00000018c43e2450 _items
……..

0:027> !do 00000018c43e2450 
Name: System.Collections.Hashtable
MethodTable: 000007fa22e7f578
EEClass: 000007fa22a82390
Size: 88(0x58) bytes
 (C:\Windows\assembly\GAC_64\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll)
Fields:
              MT    Field   Offset                 Type VT     Attr            Value Name
000007fa22e7f740  400098d        8 ...ashtable+bucket[]  0 instance 00000018c43e24a8 buckets
000007fa22e7ee90  400098e       38         System.Int32  1 instance                2 count
000007fa22e7ee90  400098f       3c         System.Int32  1 instance                0 occupancy
000007fa22e7ee90  4000990       40         System.Int32  1 instance                7 loadsize
000007fa22e74318  4000991       44        System.Single  1 instance 0.720000 loadFactor


0:027> !da -details 00000018c43e24a8 
Name: System.Collections.Hashtable+bucket[]
MethodTable: 000007fa22e7f740
EEClass: 000007fa22b214c8
Size: 288(0x120) bytes
Array: Rank 1, Number of elements 11, Type VALUETYPE
Element Methodtable: 000007fa22e7f8a8
…………..
[5] 00000018c43e2530
    Name: System.Collections.Hashtable+bucket
    MethodTable 000007fa22e7f8a8
    EEClass: 000007fa22b21600
    Size: 40(0x28) bytes
     (C:\Windows\assembly\GAC_64\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll)
    Fields:
                  MT    Field   Offset                 Type VT     Attr            Value Name
    000007fa22e77510  4000999        0        System.Object  0 instance 00000018c43e2db0 key
    000007fa22e77510  400099a        8        System.Object  0 instance 00000018c43e2de0 val
    000007fa22e7ee90  400099b       10         System.Int32  1 instance        817416418 hash_coll

0:027> !do 00000018c43e2db0 
Name: System.String
MethodTable: 000007fa22e77c20
EEClass: 000007fa22a7e550
Size: 46(0x2e) bytes
 (C:\Windows\assembly\GAC_64\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll)
String: AspSession
……

0:027> !do 00000018c43e2de0 
Name: System.Web.SessionState.HttpSessionState
MethodTable: 000007f9e9298258
EEClass: 000007f9e8ef3e70
Size: 24(0x18) bytes
 (C:\Windows\assembly\GAC_64\System.Web\2.0.0.0__b03f5f7f11d50a3a\System.Web.dll)
Fields:
              MT    Field   Offset                 Type VT     Attr            Value Name
000007f9e9238018  4001f5e        8 ...IHttpSessionState  0 instance 00000018c43e2d70 _container

4. 直接通过review代码来找到Session内的数据保存在那里有点困难. HttpSessionState的 _container是一个接口类型. 在代码中找到确切的类型会比较花时间.

5. 通过dump, 我们可以看到_container的确切类型是System.Web.SessionState.HttpSessionStateContainer. 所以也就检查该类型的代码, 发生数据是保持在 _sessionItems的对象上.

0:027> !do 00000018c43e2de0 
Name: System.Web.SessionState.HttpSessionState
MethodTable: 000007f9e9298258
EEClass: 000007f9e8ef3e70
Size: 24(0x18) bytes
 (C:\Windows\assembly\GAC_64\System.Web\2.0.0.0__b03f5f7f11d50a3a\System.Web.dll)
Fields:
              MT    Field   Offset                 Type VT     Attr            Value Name
000007f9e9238018  4001f5e        8 ...IHttpSessionState  0 instance 00000018c43e2d70 _container

0:027> !do 00000018c43e2d70 
Name: System.Web.SessionState.HttpSessionStateContainer
MethodTable: 000007f9e92a0ea0
EEClass: 000007f9e8ef73b8
Size: 64(0x40) bytes
 (C:\Windows\assembly\GAC_64\System.Web\2.0.0.0__b03f5f7f11d50a3a\System.Web.dll)
Fields:
              MT    Field   Offset                 Type VT     Attr            Value Name
000007fa22e77c20  4001f5f        8        System.String  0 instance 0000000000000000 _id
000007f9e9208b28  4001f60       10 ...ateItemCollection  0 instance 00000018c43e2630 _sessionItems
000007f9e92979c8  4001f61       18 ...ObjectsCollection  0 instance 00000018c43e2b80 _staticObjects
000007fa22e7ee90  4001f62       28         System.Int32  1 instance               20 _timeout
000007fa22e76df0  4001f63       34       System.Boolean  1 instance                1 _newSession
000007f9e92a1f00  4001f64       2c         System.Int32  1 instance                1 _cookieMode
000007f9e92a1dd0  4001f65       30         System.Int32  1 instance                1 _mode
000007fa22e76df0  4001f66       35       System.Boolean  1 instance                0 _abandon
000007fa22e76df0  4001f67       36       System.Boolean  1 instance                0 _isReadonly
000007f9e92a0de8  4001f68       20 ...essionStateModule  0 instance 00000019043a7190 _stateModule

6. 按照同样的步骤, _sessionItem的类型为System.Web.SessionState.SessionStateItemCollection. 数据保存在_entriesTable 中, 这里是Session保存数据的地方.

7. 按照代码中找到的结果, 需要从DUMP中列出_entriesTable的元素. 这样就可以检查Session中所保存的数据.

实例代码 :

0:027> !do 00000018c43e2630 
Name: System.Web.SessionState.SessionStateItemCollection
MethodTable: 000007f9e9208c70
EEClass: 000007f9e8eafd60
Size: 112(0x70) bytes
 (C:\Windows\assembly\GAC_64\System.Web\2.0.0.0__b03f5f7f11d50a3a\System.Web.dll)
Fields:
              MT    Field   Offset                 Type VT     Attr            Value Name
000007fa22e76df0  400118f       44       System.Boolean  1 instance                0 _readOnly
000007fa22e7eb08  4001190        8 ...ections.ArrayList  0 instance 00000018c43e29e0 _entriesArray
000007fa22e7ff28  4001191       10 ...IEqualityComparer  0 instance 00000018c436e9e0 _keyComparer
000007fa22e7f578  4001192       18 ...ections.Hashtable  0 instance 00000018c43e2a08 _entriesTable
000007fa22173e60  4001193       20 ...e+NameObjectEntry  0 instance 0000000000000000 _nullKeyEntry

0:027> !do 00000018c43e2a08 
Name: System.Collections.Hashtable
MethodTable: 000007fa22e7f578
EEClass: 000007fa22a82390
Size: 88(0x58) bytes
 (C:\Windows\assembly\GAC_64\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll)
Fields:
              MT    Field   Offset                 Type VT     Attr            Value Name
000007fa22e7f740  400098d        8 ...ashtable+bucket[]  0 instance 00000018c4423be8 buckets
000007fa22e7ee90  400098e       38         System.Int32  1 instance               10 count
000007fa22e7ee90  400098f       3c         System.Int32  1 instance                4 occupancy
000007fa22e7ee90  4000990       40         System.Int32  1 instance               16 loadsize
…..

0:027> !da -details 00000018c4423be8 
Name: System.Collections.Hashtable+bucket[]
MethodTable: 000007fa22e7f740
EEClass: 000007fa22b214c8
Size: 576(0x240) bytes
Array: Rank 1, Number of elements 23, Type VALUETYPE
Element Methodtable: 000007fa22e7f8a8

……
[10] 00000018c4423ce8
    Name: System.Collections.Hashtable+bucket
    MethodTable 000007fa22e7f8a8
    EEClass: 000007fa22b21600
    Size: 40(0x28) bytes
     (C:\Windows\assembly\GAC_64\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll)
    Fields:
                  MT    Field   Offset                 Type VT     Attr            Value Name
    000007fa22e77510  4000999        0        System.Object  0 instance 00000018c44235f0 key
    000007fa22e77510  400099a        8        System.Object  0 instance 00000018c4423690 val
000007fa22e7ee90  400099b       10         System.Int32  1 instance       1884180917 hash_coll
…….

0:027> !do 00000018c4423690 
Name: System.Collections.Specialized.NameObjectCollectionBase+NameObjectEntry
MethodTable: 000007fa22173e60
EEClass: 000007fa21ee9158
Size: 32(0x20) bytes
 (C:\Windows\assembly\GAC_MSIL\System\2.0.0.0__b77a5c561934e089\System.dll)
Fields:
              MT    Field   Offset                 Type VT     Attr            Value Name
000007fa22e77c20  4001199        8        System.String  0 instance 00000018c44235f0 Key
000007fa22e77510  400119a       10        System.Object  0 instance 00000018c4423650 Value
0:027> !do 00000018c4423690
Name: System.Collections.Specialized.NameObjectCollectionBase+NameObjectEntry
MethodTable: 000007fa22173e60
EEClass: 000007fa21ee9158
Size: 32(0x20) bytes
 (C:\Windows\assembly\GAC_MSIL\System\2.0.0.0__b77a5c561934e089\System.dll)
Fields:
              MT    Field   Offset                 Type VT     Attr            Value Name
000007fa22e77c20  4001199        8        System.String  0 instance 00000018c44235f0 Key
000007fa22e77510  400119a       10        System.Object  0 instance 00000018c4423650 Value



0:027> !do 00000018c44235f0 
Name: System.String
MethodTable: 000007fa22e77c20
EEClass: 000007fa22a7e550
Size: 40(0x28) bytes
 (C:\Windows\assembly\GAC_64\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll)
String: Key : 2    ------------->  测试数据中的Key值
…….


0:027> !do 00000018c4423690
Name: System.Collections.Specialized.NameObjectCollectionBase+NameObjectEntry
MethodTable: 000007fa22173e60
EEClass: 000007fa21ee9158
Size: 32(0x20) bytes
 (C:\Windows\assembly\GAC_MSIL\System\2.0.0.0__b77a5c561934e089\System.dll)
Fields:
              MT    Field   Offset                 Type VT     Attr            Value Name
000007fa22e77c20  4001199        8        System.String  0 instance 00000018c44235f0 Key
000007fa22e77510  400119a       10        System.Object  0 instance 00000018c4423650 Value
0:027> !do 00000018c4423650 
Name: System.String
MethodTable: 000007fa22e77c20
EEClass: 000007fa22a7e550
Size: 62(0x3e) bytes
 (C:\Windows\assembly\GAC_64\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll)
String: Here is value :20;    ------------->  测试数据中的Value值
……..

希望以上内容对您有所帮助

Sonic Guo

posted on 2013-05-19 11:30  微软互联网开发支持  阅读(3735)  评论(19编辑  收藏  举报