.NET进阶系列之二:VS2005 Sos调试扩展

VS 2005提供比较完备的代码调试功能,像F9,F10,F11,Attach这些为大家所熟知的。除此之外,在某些特殊的情况下,或者仅仅是由于好奇(比如我),我们希望跟踪程序运行时候的内存变化,这时我们可以通过载入sos.dll来辅助调试。
 
SOS“Son of Strike”的缩写,应该就是一个代号,没什么具体意思。
 
在使用SOS之前,需要于VS 2005中做如下设置:
1、需要在项目->属性->调试-〉启用非托管代码调试,为代码打上断点,然后运行代码
2、打开调试-〉窗口-〉即时
3、在即时窗口中输入 !load sos.dll 加载调试模块(如果有必要可以输入sos.dll的全路径,位于C:"WINDOWS"Microsoft.NET"Framework"的相应版本下)
 
完成后我们就可以执行SOS中的命令了,命令以!开始,格式如:![command] [options]。以下表格介绍部分常见的SOS命令:

CLRstack [-p][-l][-a]
显示CLR栈上的内容(常用-a参数
[-p]
显示托管函数的参数
[-l]
 
[-a]
 
Dumpheap [-stat] [-min <size>][-max <size>] [-thinlock] [-mt <MethodTable address>] [-type <partial type name>][start [end]]
显示堆上的内容(常用-stat参数
[-stat]
选项将输出限制为统计类型摘要
[-min <size>]
选项忽略小于 size 参数指定的大小(单位为字节)的对象
[-max <size>]
选项忽略大于 size 参数指定的大小(单位为字节)的对象
[-thinlock]
选项报告 ThinLocks 有关更多信息,请参见 SyncBlk 命令
[-mt <MethodTable address>]
选项仅列出与指定的 MethodTable 结构对应的那些对象
[-type <partial type name>]
选项仅列出其类型名称属于指定字符串的子串的那些对象
[start [end]]
参数从指定的地址处开始列出,end 参数在指定的地址处停止列出
Do/dumpobj <object address>
显示有关指定地址处的对象的信息
Dumpstack [-EE] [top stack [bottom stack]]
显示栈内容
[-EE]
使 DumpStack 命令仅显示托管函数
[top stack [bottom stack]]
使用 top bottom 参数可限制 x86 平台上显示的堆栈帧
Dso/dumpstackobjects [-verify] [top stack [bottom stack]]
显示在当前堆栈的边界内找到的所有托管对象
[-verify]
选项验证对象字段的每个非静态 CLASS 字段
[top stack [bottom stack]]
 
Da/dumparray [-start <startIndex>] [-length <length>] [-details] [-nofields] <array object address>
检查数组对象的元素(常用参数-details
[-start <startIndex>]
选项指定开始显示元素的起始索引
[-length <length>]
选项指定要显示的元素数量
[-details]
选项使用 DumpObj DumpVC 格式显示元素的详细信息
[-nofields]
选项可阻止显示数组。 此选项只有在指定了 -detail 选项之后才可用
DumpMT [-MD] <MethodTable address>
显示有关指定地址处的方法表的信息
[-MD]
选项将显示与对象一起定义的所有方法的列表
DumpVC <MethodTable address> <Address>
显示有关指定地址处的值类字段的信息
help [<command>] [<faq>]
在未指定参数时显示所有可用命令,或者显示有关指定命令的详细帮助信息。
[<command>]
指定要查看的命令
[<faq>]
显示关于此命令的的常见问题回答

 
剩余的命令,你可以通过MSDN导航,查找:
msdn library>>.NET开发>>.net framework 3.5>>.net framework;>>工具(.net framework>>.net framework 工具;>>sos调试扩展。
 
 
下面演示查看DataTable对象在内存中的情况,C#代码如下:
static void Main(string[] args)
{
    DataTable dt = new DataTable();
    dt.Columns.Add("fname");
    dt.Columns.Add("fvalue");
    dt.Rows.Add("zhang san", 100);
    dt.AcceptChanges();//Breakpoint 1
    dt.Rows[0][1] = 112;
}//Breakpoint 2
 
首先F5到达breakpoint 1,然后执行以下命令:
 
!load sos.dll
extension C:"WINDOWS"Microsoft.NET"Framework"v2.0.50727"sos.dll loaded
!dumpstackobjects
PDB symbol for mscorwks.dll not loaded 
OS Thread Id: 0x1180 (4480)
ESP/REG Object   Name
0012f098 0137d27c System.Data.DataTable (1)
0012f0bc 0137d27c System.Data.DataTable
0012f200 0137d27c System.Data.DataTable
0012f208 01367cc4 System.Object[]    (System.Object[])
0012f444 01366a4c System.Object[]    (System.String[])
0012f45c 0137cdc8 System.Object[]    (System.String[])
0012f534 0137cdc8 System.Object[]    (System.String[])
0012f6e0 0137cdc8 System.Object[]    (System.String[])
0012f708 01366a4c System.Object[]    (System.String[])
 
执行dumpstackobjects后的结果列表共三列,第一列esp/reg不知道所指为何,可能是寄存器相关的一些东西;第二列object是对象的指针,在下面的do命令中我们将用到;第三列name为对象类型。除了datatable外,还有向个object[],可能是main方法的参数或者其它的一些东西。
 
!do 0137d27c
Name: System.Data.DataTable
MethodTable: 65407d48
EEClass: 654078f8
Size: 296(0x128) bytes
 (C:"WINDOWS"assembly"GAC_32"System.Data"2.0.0.0__b77a5c561934e089"System.Data.dll)
Fields:
      MT    Field   Offset                 Type VT     Attr    Value Name
7a7567d8 40009a3        4 ...ponentModel.ISite 0 instance 00000000 site
7a755968 40009a4        8 ....EventHandlerList 0 instance 00000000 events
790fd0f0 40009a2      1e8        System.Object 0   static 00000000 EventDisposed
65406ecc 4000799        c System.Data.DataSet 0 instance 00000000 dataSet
65409004 400079a       10 System.Data.DataView 0 instance 00000000 defaultView
79102290 400079b       d0         System.Int32 1 instance        2 nextRowID
654097e8 400079c       14 ...DataRowCollection 0 instance 01367148 rowCollection
654094f4 400079d       18 ...aColumnCollection 0 instance 01366ff8 columnCollection (1)
65409638 400079e       1c ...straintCollection 0 instance 01367110 constraintCollection
79102290 400079f       d4         System.Int32 1 instance        2 elementColumnCount
6540a0e8 40007a0       20 ...elationCollection 0 instance 00000000 parentRelationsCollection
6540a0e8 40007a1       24 ...elationCollection 0 instance 00000000 childRelationsCollection
654093f4 40007a2       28 ...ata.RecordManager 0 instance 01366fb4 recordManager
00000000 40007a3       2c                       0 instance 01367660 indexes
00000000 40007a4       30                       0 instance 00000000 shadowIndexes
79102290 40007a5       d8         System.Int32 1 instance        0 shadowCount
65410fd0 40007a6       34 ...ropertyCollection 0 instance 00000000 extendedProperties
790fd8c4 40007a7       38        System.String 0 instance 01344fa0 tableName
790fd8c4 40007a8       3c        System.String 0 instance 00000000 tableNamespace
790fd8c4 40007a9       40        System.String 0 instance 01344fa0 tablePrefix
6540a93c 40007aa       44 ...ta.DataExpression 0 instance 00000000 displayExpression
7910be50 40007ab       f0       System.Boolean 1 instance        1 fNestedInDataset
791028f4 40007ac       48 ...ation.CultureInfo 0 instance 01344fb4 _culture
7910be50 40007ad       f1       System.Boolean 1 instance        0 _cultureUserSet
7911354c 40007ae       4c ...ation.CompareInfo 0 instance 00000000 _compareInfo
79124788 40007af       dc         System.Int32 1 instance       25 _compareFlags
79103200 40007b0       50 ...m.IFormatProvider 0 instance 00000000 _formatProvider
791168f8 40007b1       54 ...em.StringComparer 0 instance 01367b38 _hashCodeProvider
7910be50 40007b2       f2       System.Boolean 1 instance        0 _caseSensitive
7910be50 40007b3       f3       System.Boolean 1 instance        0 _caseSensitiveUserSet
790fd8c4 40007b4       58        System.String 0 instance 00000000 encodedTableName
654088b4 40007b5       5c ...m.Data.DataColumn 0 instance 00000000 xmlText
654088b4 40007b6       60 ...m.Data.DataColumn 0 instance 00000000 _colUnique
7910be50 40007b7       f4       System.Boolean 1 instance        0 textOnly
7910c52c 40007b8      104       System.Decimal 1 instance 0137d380 minOccurs
7910c52c 40007b9      114       System.Decimal 1 instance 0137d390 maxOccurs
7910be50 40007ba       f5       System.Boolean 1 instance        0 repeatableElement
790fd0f0 40007bb       64        System.Object 0 instance 00000000 typeName
6540b250 40007bf       68 ....UniqueConstraint 0 instance 00000000 primaryKey
65412da4 40007c1       6c ...Data.IndexField[] 0 instance 0137d3d0 _primaryIndex
7912d8f8 40007c2       70      System.Object[] 0 instance 00000000 delayedSetPrimaryKey
65409b14 40007c3       74    System.Data.Index 0 instance 00000000 loadIndex
65409b14 40007c4       78    System.Data.Index 0 instance 00000000 loadIndexwithOriginalAdded
65409b14 40007c5       7c    System.Data.Index 0 instance 00000000 loadIndexwithCurrentDeleted
79102290 40007c6       e0         System.Int32 1 instance        0 _suspendIndexEvents
7910be50 40007c7       f6       System.Boolean 1 instance        0 savedEnforceConstraints
7910be50 40007c8       f7       System.Boolean 1 instance        0 inDataLoad
7910be50 40007c9       f8       System.Boolean 1 instance        0 initialLoad
7910be50 40007ca       f9       System.Boolean 1 instance        0 schemaLoading
7910be50 40007cb       fa       System.Boolean 1 instance        1 enforceConstraints
7910be50 40007cc       fb       System.Boolean 1 instance        0 _suspendEnforceConstraints
7910be50 40007cd       fc       System.Boolean 1 instance        0 fInitInProgress
7910be50 40007ce       fd       System.Boolean 1 instance        0 inLoad
7910be50 40007cf       fe       System.Boolean 1 instance        0 fInLoadDiffgram
79101e20 40007d0       ff          System.Byte 1 instance        2 _isTypedDataTable
7912d8f8 40007d1       80      System.Object[] 0 instance 00000000 EmptyDataRowArray
7a764404 40007d2       84 ...criptorCollection 0 instance 00000000 propertyDescriptorCollectionCache
7912d8f8 40007d4       88      System.Object[] 0 instance 0137d3dc _nestedParentRelations
00000000 40007d5       8c                       0 instance 00000000 dependentColumns
7910be50 40007d6      100       System.Boolean 1 instance        0 mergingData
6541d27c 40007d7       90 ...hangeEventHandler 0 instance 00000000 onRowChangedDelegate
6541d27c 40007d8       94 ...hangeEventHandler 0 instance 00000000 onRowChangingDelegate
6541d27c 40007d9       98 ...hangeEventHandler 0 instance 00000000 onRowDeletingDelegate
6541d27c 40007da       9c ...hangeEventHandler 0 instance 00000000 onRowDeletedDelegate
6541c36c 40007db       a0 ...hangeEventHandler 0 instance 00000000 onColumnChangedDelegate
6541c36c 40007dc       a4 ...hangeEventHandler 0 instance 00000000 onColumnChangingDelegate
6541d8ec 40007dd       a8 ...ClearEventHandler 0 instance 00000000 onTableClearingDelegate
6541d8ec 40007de       ac ...ClearEventHandler 0 instance 00000000 onTableClearedDelegate
6541d97c 40007df       b0 ...ewRowEventHandler 0 instance 00000000 onTableNewRowDelegate
7a7689e4 40007e0       b4 ...angedEventHandler 0 instance 00000000 onPropertyChangingDelegate
791044dc 40007e1       b8 System.EventHandler 0 instance 00000000 onInitialized
65409c7c 40007e2       bc ...ta.DataRowBuilder  0 instance 01367688 rowBuilder
00000000 40007e3       c0                       0 instance 0137d440 delayedViews
00000000 40007e4       c4                       0 instance 0137d468 _dataViewListeners
79101fe4 40007e5       c8 ...ections.Hashtable 0 instance 00000000 rowDiffId
79108ba4 40007e6       cc ....ReaderWriterLock 0 instance 0137d490 indexesLock
79102290 40007e7       e4         System.Int32 1 instance       -1 ukColumnPositionForInference
654116b8 40007e8       e8         System.Int32 1 instance        0 _remotingFormat
79102290 40007ea       ec         System.Int32 1 instance        1 _objectID
7912d7c0 40007bc      15c       System.Int32[] 0   static 0137d3a4 zeroIntegers
7912d8f8 40007bd      160      System.Object[] 0   static 0137d3b0 zeroColumns
7912d8f8 40007be      164      System.Object[] 0   static 0137d3c0 zeroRows
65412da4 40007c0      168 ...Data.IndexField[] 0   static 0137d3d0 zeroIndexField
7912d8f8 40007d3      16c      System.Object[] 0   static 0137d3dc EmptyArrayDataRelation
79102290 40007e9      490         System.Int32 1   static        1 _objectTypeCount
 
通过do命令我们dumpdatatable对象在堆上的状况,从上面可以看出datatable对象比较复杂,除去其它我们不关心的,我们找到了columncollection
 
!do 01366ff8
Name: System.Data.DataColumnCollection
MethodTable: 654094f4
EEClass: 65409484
Size: 56(0x38) bytes
 (C:"WINDOWS"assembly"GAC_32"System.Data"2.0.0.0__b77a5c561934e089"System.Data.dll)
Fields:
      MT    Field   Offset                 Type VT     Attr    Value Name
7a766474 4000686      148 ...onChangeEventArgs 0   static 00000000 RefreshEventArgs
65407d48 40006dc        4 ...em.Data.DataTable 0 instance 0137d27c table
79104368 40006dd        8 ...ections.ArrayList 0 instance 01367030 _list
79102290 40006de       24         System.Int32 1 instance        1 defaultNameIndex
7912d8f8 40006df        c      System.Object[] 0 instance 00000000 delayedAddRangeColumns
79101fe4 40006e0       10 ...ections.Hashtable 0 instance 01367048 columnFromName
7a7664d4 40006e1       14 ...hangeEventHandler 0 instance 00000000 onCollectionChangedDelegate
7a7664d4 40006e2       18 ...hangeEventHandler 0 instance 00000000 onCollectionChangingDelegate
7a7664d4 40006e3       1c ...hangeEventHandler 0 instance 00000000 onColumnPropertyChangedDelegate
7910be50 40006e4       30       System.Boolean 1 instance        0 fInClear
7912d8f8 40006e5       20      System.Object[] 0 instance 0137d3b0 columnsImplementingIChangeTracking
79102290 40006e6       28         System.Int32 1 instance        0 nColumnsImplementingIChangeTracking
79102290 40006e7       2c         System.Int32 1 instance        0 nColumnsImplementingIRevertibleChangeTracking
 
!do 01367030
Name: System.Collections.ArrayList
MethodTable: 79104368
EEClass: 791042bc
Size: 24(0x18) bytes
 (C:"WINDOWS"assembly"GAC_32"mscorlib"2.0.0.0__b77a5c561934e089"mscorlib.dll)
Fields:
      MT    Field   Offset                 Type VT     Attr    Value Name
7912d8f8 40008ea        4      System.Object[] 0 instance 01367c10 _items
79102290 40008eb        c         System.Int32 1 instance        2 _size
79102290 40008ec       10         System.Int32 1 instance        2 _version
790fd0f0 40008ed        8        System.Object 0 instance 00000000 _syncRoot
7912d8f8 40008ee      1c0      System.Object[] 0   shared   static emptyArray
    >> Domain:Value 0015c960:01341748 <<
 
!da -details 01367c10
Name: System.Object[]
MethodTable: 7912d8f8
EEClass: 7912de6c
Size: 32(0x20) bytes
Array: Rank 1, Number of elements 4, Type CLASS
Element Methodtable: 790fd0f0
[0] 01367698
    Name: System.Data.DataColumn
    MethodTable: 654088b4
    EEClass: 6540883c
    Size: 148(0x94) bytes
     (C:"WINDOWS"assembly"GAC_32"System.Data"2.0.0.0__b77a5c561934e089"System.Data.dll)
    Fields:
          MT    Field   Offset                 Type VT     Attr    Value Name
    7a7567d8 40009a3        4 ...ponentModel.ISite 0 instance 00000000 site
    7a755968 40009a4        8 ....EventHandlerList 0 instance 00000000 events
    790fd0f0 40009a2      1e8        System.Object 0   static 00000000 EventDisposed
    7910be50 40006b3       84       System.Boolean 1 instance        1 allowNull
    7910be50 40006b4       85       System.Boolean 1 instance        0 autoIncrement
    790ffcc8 40006b5        c         System.Int64 1 instance 1 autoIncrementStep
    790ffcc8 40006b6       14         System.Int64 1 instance 0 autoIncrementSeed
    790fd8c4 40006b7       24        System.String 0 instance 00000000 caption
    790fd8c4 40006b8       28        System.String 0 instance 0137d21c _columnName
    79106894 40006b9       2c          System.Type 0 instance 0134acf0 dataType
   790fd0f0 40006ba       30        System.Object 0 instance 013677f4 defaultValue
    654118d8 40006bb       68         System.Int32 1 instance        3 _dateTimeMode
    6540a93c 40006bc       34 ...ta.DataExpression 0 instance 00000000 expression
    79102290 40006bd       6c         System.Int32 1 instance       -1 maxLength
    79102290 40006be       70         System.Int32 1 instance        0 _ordinal
    7910be50 40006bf       86       System.Boolean 1 instance        0 readOnly
    65409b14 40006c0       38    System.Data.Index 0 instance 00000000 sortIndex
    65407d48 40006c1       3c ...em.Data.DataTable 0 instance 0137d27c table
    7910be50 40006c2       87       System.Boolean 1 instance        0 unique
    65410da8 40006c3       74         System.Int32 1 instance        1 columnMapping
    79102290 40006c4       78         System.Int32 1 instance 1328915167 _hashCode
    79102290 40006c5       7c         System.Int32 1 instance        0 errors
    7910be50 40006c6       88       System.Boolean 1 instance        0 isSqlType
    7910be50 40006c7       89       System.Boolean 1 instance        0 implementsINullable
    7910be50 40006c8       8a       System.Boolean 1 instance        0 implementsIChangeTracking
    7910be50 40006c9       8b       System.Boolean 1 instance        0 implementsIRevertibleChangeTracking
    7910be50 40006ca       8c       System.Boolean 1 instance        0 implementsIXMLSerializable
    7910be50 40006cb       8d       System.Boolean 1 instance        1 defaultValueIsNull
    00000000 40006cc       40                       0 instance 00000000 dependentColumns
    65410fd0 40006cd       44 ...ropertyCollection 0 instance 00000000 extendedProperties
    7a7689e4 40006ce       48 ...angedEventHandler 0 instance 00000000 onPropertyChangingDelegate
    65401748 40006cf       4c ...ommon.DataStorage 0 instance 01367ce8 _storage
    790ffcc8 40006d0       1c         System.Int64 1 instance 0 autoIncrementCurrent
    790fd8c4 40006d1       50        System.String 0 instance 00000000 _columnUri
    790fd8c4 40006d2       54        System.String 0 instance 01344fa0 _columnPrefix
    790fd8c4 40006d3       58        System.String 0 instance 00000000 encodedColumnName
    790fd8c4 40006d4       5c        System.String 0 instance 01344fa0 description
    790fd8c4 40006d5       60        System.String 0 instance 01344fa0 dttype
    65409d70 40006d6       64 ...m.Data.SimpleType 0 instance 00000000 simpleType
    79102290 40006d8       80         System.Int32 1 instance        1 _objectID
    79102290 40006d7      47c         System.Int32 1   static        2 _objectTypeCount
[1] 01367c30 (1)
    Name: System.Data.DataColumn
    MethodTable: 654088b4
    EEClass: 6540883c
    Size: 148(0x94) bytes
     (C:"WINDOWS"assembly"GAC_32"System.Data"2.0.0.0__b77a5c561934e089"System.Data.dll)
    Fields:
          MT    Field   Offset                 Type VT     Attr    Value Name
    7a7567d8 40009a3        4 ...ponentModel.ISite 0 instance 00000000 site
    7a755968 40009a4        8 ....EventHandlerList 0 instance 00000000 events
    790fd0f0 40009a2      1e8        System.Object 0   static 00000000 EventDisposed
    7910be50 40006b3       84       System.Boolean 1 instance        1 allowNull
    7910be50 40006b4       85       System.Boolean 1 instance        0 autoIncrement
    790ffcc8 40006b5        c         System.Int64 1 instance 1 autoIncrementStep
    790ffcc8 40006b6       14         System.Int64 1 instance 0 autoIncrementSeed
    790fd8c4 40006b7       24        System.String 0 instance 00000000 caption
    790fd8c4 40006b8       28        System.String 0 instance 0137d238 _columnName
    79106894 40006b9       2c          System.Type 0 instance 0134acf0 dataType
    790fd0f0 40006ba       30        System.Object 0 instance 013677f4 defaultValue
    654118d8 40006bb       68         System.Int32 1 instance        3 _dateTimeMode
    6540a93c 40006bc       34 ...ta.DataExpression 0 instance 00000000 expression
    79102290 40006bd       6c         System.Int32 1 instance       -1 maxLength
    79102290 40006be       70         System.Int32 1 instance        1 _ordinal
    7910be50 40006bf       86       System.Boolean 1 instance        0 readOnly
    65409b14 40006c0       38    System.Data.Index 0 instance 00000000 sortIndex
    65407d48 40006c1       3c ...em.Data.DataTable 0 instance 0137d27c table
    7910be50 40006c2       87       System.Boolean 1 instance        0 unique
    65410da8 40006c3       74         System.Int32 1 instance        1 columnMapping
    79102290 40006c4       78         System.Int32 1 instance -1185130635 _hashCode
    79102290 40006c5       7c         System.Int32 1 instance        0 errors
    7910be50 40006c6       88       System.Boolean 1 instance        0 isSqlType
    7910be50 40006c7       89       System.Boolean 1 instance        0 implementsINullable
    7910be50 40006c8       8a       System.Boolean 1 instance        0 implementsIChangeTracking
    7910be50 40006c9       8b       System.Boolean 1 instance        0 implementsIRevertibleChangeTracking
    7910be50 40006ca       8c       System.Boolean 1 instance        0 implementsIXMLSerializable
    7910be50 40006cb       8d       System.Boolean  1 instance        1 defaultValueIsNull
    00000000 40006cc       40                       0 instance 00000000 dependentColumns
    65410fd0 40006cd       44 ...ropertyCollection 0 instance 00000000 extendedProperties
    7a7689e4 40006ce       48 ...angedEventHandler 0 instance 00000000 onPropertyChangingDelegate
    65401748 40006cf       4c ...ommon.DataStorage 0 instance 01367f24 _storage (2)
    790ffcc8 40006d0       1c         System.Int64 1 instance 0 autoIncrementCurrent
    790fd8c4 40006d1       50        System.String 0 instance 00000000 _columnUri
    790fd8c4 40006d2       54        System.String 0 instance 01344fa0 _columnPrefix
    790fd8c4 40006d3       58        System.String 0 instance 00000000 encodedColumnName
    790fd8c4 40006d4       5c        System.String 0 instance 01344fa0 description
    790fd8c4 40006d5       60        System.String 0 instance 01344fa0 dttype
    65409d70 40006d6       64 ...m.Data.SimpleType 0 instance 00000000 simpleType
    79102290 40006d8       80         System.Int32 1 instance        2 _objectID
    79102290 40006d7      47c         System.Int32 1   static        2 _objectTypeCount
[2] null
[3] null
 
(1)由于_items是一个数组,我们通过da命令取得数组的内部情况,数组包含4个元素(由程序代码可知我们只有声明了两列,因此为何出现4个元素待研究)。
(2)datacolumn的内容则存储于_storage中,红色标识行(2)
 
!do 01367f24
Name: System.Data.Common.StringStorage
MethodTable: 6540b09c
EEClass: 65450e8c
Size: 44(0x2c) bytes
 (C:"WINDOWS"assembly"GAC_32"System.Data"2.0.0.0__b77a5c561934e089"System.Data.dll)
Fields:
      MT    Field   Offset                 Type VT     Attr    Value Name
654088b4 4000b2b        4 ...m.Data.DataColumn 0 instance 01367c30 Column
65407d48 4000b2c        8 ...em.Data.DataTable 0 instance 0137d27c Table
79106894 4000b2d        c          System.Type 0 instance 0134acf0 DataType
65420068 4000b2e       1c         System.Int32 1 instance       18 StorageTypeCode
79123930 4000b2f       10 ...lections.BitArray 0 instance 00000000 dbNullBits
790fd0f0 4000b30       14        System.Object 0 instance 790d884c DefaultValue
790fd0f0 4000b31       18        System.Object 0 instance 013677f4 NullValue
7910be50 4000b32       20       System.Boolean 1 instance        0 IsCloneable
7910be50 4000b33       21       System.Boolean 1 instance        0 IsCustomDefinedType
7910be50 4000b34       22       System.Boolean 1 instance        1 IsStringType
7910be50 4000b35       23       System.Boolean 1 instance        0 IsValueType
7912d8f8 4000b2a      1dc      System.Object[] 0   static 01367800 StorageClassType
7912d8f8 4000cb1       24      System.Object[] 0 instance 01367f50 values
 
!da -details 01367f50
Name: System.String[]
MethodTable: 7912d8f8
EEClass: 7912de6c
Size: 528(0x210) bytes
Array: Rank 1, Number of elements 128, Type CLASS
Element Methodtable: 790fd8c4
[0] 01368600 (1)
    Name: System.String
    MethodTable: 790fd8c4
    EEClass: 790fd824
    Size: 24(0x18) bytes
     (C:"WINDOWS"assembly"GAC_32"mscorlib"2.0.0.0__b77a5c561934e089"mscorlib.dll)
    String:     100    (2)
    Fields:
          MT    Field   Offset                 Type VT     Attr    Value Name
    79102290 4000096        4         System.Int32 1 instance        4 m_arrayLength
    79102290 4000097        8         System.Int32 1 instance        3 m_stringLength
    790ff328 4000098        c          System.Char 1 instance       31 m_firstChar
    790fd8c4 4000099       10        System.String 0   shared   static Empty
    >> Domain:Value 0015c960:790d884c <<
    7912dd40 400009a       14        System.Char[] 0   shared   static WhitespaceChars
    >> Domain:Value 0015c960:013414e0 <<
[1] null
[2] null
[3] null
[4] null
[5] null
[6] null
[7] null
[8] null
[9] null
[10] null
[11] null
[12] null
[13] null
[14] null
[15] null
[16] null
[17] null
[18] null
[19] null
[20] null
[21] null
[22] null
[23] null
[24] null
[25] null
[26] null
[27] null
[28] null
[29] null
[30] null
[31] null
[32] null
[33] null
[34] null
[35] null
[36] null
[37] null
[38] null
[39] null
[40] null
[41] null
[42] null
[43] null
[44] null
[45] null
[46] null
[47] null
[48] null
[49] null
[50] null
[51] null
[52] null
[53] null
[54] null
[55] null
[56] null
[57] null
[58] null
[59] null
[60] null
[61] null
[62] null
[63] null
[64] null
[65] null
[66] null
[67] null
[68] null
[69] null
[70] null
[71] null
[72] null
[73] null
[74] null
[75] null
[76] null
[77] null
[78] null
[79] null
[80] null
[81] null
[82] null
[83] null
[84] null
[85] null
[86] null
[87] null
[88] null
[89] null
[90] null
[91] null
[92] null
[93] null
[94] null
[95] null
[96] null
[97] null
[98] null
[99] null
[100] null
[101] null
[102] null
[103] null
[104] null
[105] null
[106] null
[107] null
[108] null
[109] null
[110] null
[111] null
[112] null
[113] null
[114] null
[115] null
[116] null
[117] null
[118] null
[119] null
[120] null
[121] null
[122] null
[123] null
[124] null
[125] null
[126] null
[127] null
 
(1)使用da命令获取values数组的内容,即datatable第二列的所有行的内容(由程序代码可知我们只有添加了一行,因此为何出现多余行待研究)。
(2)查看第一个数组元素的值:100
 
F5到达breakpoint 2,然后执行以下命令:
由于我们仅修改了datatable某一单元格的值,因此不会造成datatabledatacolumn或者其它一些对象的引用发生变化,因此当我们想要查看由于修改了某一单元格的值时,内存中的变化时,可以直接从上面的最后一步开始:
 
!da -details 01367f50
Name: System.String[]
MethodTable: 7912d8f8
EEClass: 7912de6c
Size: 528(0x210) bytes
Array: Rank 1, Number of elements 128, Type CLASS
Element Methodtable: 790fd8c4
[0] 01368600
    Name: System.String
    MethodTable: 790fd8c4
    EEClass: 790fd824
    Size: 24(0x18) bytes
     (C:"WINDOWS"assembly"GAC_32"mscorlib"2.0.0.0__b77a5c561934e089"mscorlib.dll)
    String:     100   
    Fields:
          MT    Field   Offset                 Type VT     Attr    Value Name
    79102290 4000096        4         System.Int32 1 instance        4 m_arrayLength
    79102290 4000097        8         System.Int32 1 instance        3 m_stringLength
    790ff328 4000098        c          System.Char 1 instance       31 m_firstChar
    790fd8c4 4000099       10        System.String 0   shared   static Empty
    >> Domain:Value 0015c960:790d884c <<
    7912dd40 400009a       14        System.Char[] 0   shared   static WhitespaceChars
    >> Domain:Value 0015c960:013414e0 <<
[1] 0137badc
    Name: System.String
    MethodTable: 790fd8c4
    EEClass: 790fd824
    Size: 24(0x18) bytes
     (C:"WINDOWS"assembly"GAC_32"mscorlib"2.0.0.0__b77a5c561934e089"mscorlib.dll)
    String:     112   
    Fields:
          MT    Field   Offset                 Type VT     Attr    Value Name
    79102290 4000096        4         System.Int32 1 instance        4 m_arrayLength
    79102290 4000097        8         System.Int32 1 instance        3 m_stringLength
    790ff328 4000098        c          System.Char 1 instance       31 m_firstChar
    790fd8c4 4000099       10        System.String 0   shared   static Empty
    >> Domain:Value 0015c960:790d884c <<
    7912dd40 400009a       14        System.Char[] 0   shared   static WhitespaceChars
    >> Domain:Value 0015c960:013414e0 <<
[2] null
……
[127] null
 
ps:由上面可见datacolumn中出现了两个元素,其中一个值为100,另一值为112即修改后的值,实际上对于datatable的修改,会导致产生不同的“版本”,由于修改之后未调用datatableacceptchanges()方法,故而表中仍然保留原值(关于datatable的特性描述,将在随后的一篇文章中给出)
 
 

你可能感兴趣的:(.net)