您的位置:首页 > 其它

VS中Sos调试扩展简介 (转帖)

2009-04-02 11:28 302 查看

VS 提供比较完备的代码调试功能,像F9,F10,F11,Attach这些为大家所熟知的。除此之外,在某些特殊的情况下,或者仅仅是由于好奇(比如我),我们希望跟踪程序运行时候的内存变化,这时我们可以通过载入sos.dll来辅助调试。

SOS是“Son of Strike”的缩写,应该就是一个代号,没什么具体意思。

在使用SOS之前,需要于VS 中做如下设置:

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命令我们dump了datatable对象在堆上的状况,从上面可以看出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某一单元格的值,因此不会造成datatable、datacolumn或者其它一些对象的引用发生变化,因此当我们想要查看由于修改了某一单元格的值时,内存中的变化时,可以直接从上面的最后一步开始:

!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的修改,会导致产生不同的“版本”,由于修改之后未调用datatable的acceptchanges()方法,故而表中仍然保留原值(关于datatable的特性描述,将在随后的一篇文章中给出)。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: