当前位置:首页 > 网络编程 > WEB编程 > ASP.net >  Basic Windbg - 1. SOSBasics(续)

 Basic Windbg - 1. SOSBasics(续)

点击次数:24 次 发布日期:2008-11-26 22:36:35 作者:源代码网
源代码网推荐     
源代码网推荐  书接上回,我们开始看另外几个命令。
源代码网推荐  大家如果注意看我的代码,能发现里面既有value type,也有reference type。那么,我怎么查看,当前线程状态下,我的那些变量的信息呢?对于托管代码而言,最核心的命令就是!do(dump object的缩写),这个!do后面是要加上你要看的变量的地址的。那么,我怎么知道我的变量的地址呢?
源代码网推荐  先来看另外一个命令,!dso(Dump Stack Objects的缩写),这个命令可以把当前栈上所有的变量都搞出来。我们敲一下这个命令啊:叹号+dso,看看结果:
源代码网推荐  0:000> !dso
源代码网推荐  OS Thread Id: 0x1248 (0)
源代码网推荐  ESP/REG Object Name
源代码网推荐  002df0c4 0157651c Microsoft.Win32.SafeHandles.SafeFileHandle
源代码网推荐  002df0d4 0157651c Microsoft.Win32.SafeHandles.SafeFileHandle
源代码网推荐  002df108 015765b8 System.Byte[]
源代码网推荐  002df10c 01576530 System.IO.__ConsoleStream
源代码网推荐  002df130 01576560 System.IO.StreamReader
源代码网推荐  002df134 01576560 System.IO.StreamReader
源代码网推荐  002df138 01573750 SOSBasics.MatrixWorld
源代码网推荐  002df148 01576560 System.IO.StreamReader
源代码网推荐  002df14c 015768d4 System.IO.TextReader+SyncTextReader
源代码网推荐  002df150 01573750 SOSBasics.MatrixWorld
源代码网推荐  002df160 015768d4 System.IO.TextReader+SyncTextReader
源代码网推荐  002df164 01573750 SOSBasics.MatrixWorld
源代码网推荐  002df16c 01573750 SOSBasics.MatrixWorld
源代码网推荐  002df178 01573628 System.Object[] (System.String[])
源代码网推荐  002df234 01573628 System.Object[] (System.String[])
源代码网推荐  002df3e0 01573628 System.Object[] (System.String[])
源代码网推荐  002df408 01573628 System.Object[] (System.String[])
源代码网推荐  
源代码网推荐  首先注意的一点,!dso是和线程相关的。你可以试一下,切换到1号或者2号线程,然后执行!dso,看看有什么结果?(在我这个例子面,你看不到任何结果的)
源代码网推荐  上面的列表分为三个部分,最左面一列是啥,不管它。中间一列,就是对象的地址,右面,是对象的类型。ok,我们看一下上面红色标记的那行,偶代码里面的Mtraix,它的object id是01573750,找到这个地址后,我们用!do命令来扒它的皮!执行!do 01573750,看结果
源代码网推荐  0:000> !do 01573750
源代码网推荐  Name: SOSBasics.MatrixWorld
源代码网推荐  MethodTable: 004132ac
源代码网推荐  EEClass: 0041142c
源代码网推荐  Size: 48(0x30) bytes
源代码网推荐   (c:UserscharjuDocumentsVisual Studio 2008ProjectsBasicWindbgSOSBasicsSOSBasicsinDebugSOSBasics.exe)
源代码网推荐  Fields:
源代码网推荐   MT Field Offset Type VT Attr Value Name
源代码网推荐  79102290 4000001 20 System.Int32 0 instance 6 generation
源代码网推荐  7910c348 4000002 4 System.Double 0 instance 123456789.000000 gold
源代码网推荐  790fd8c4 4000003 c System.String 0 instance 01573780 name
源代码网推荐  7910c878 4000004 24 System.DateTime 1 instance 01573774 age
源代码网推荐  79101fe4 4000005 10 ...ections.Hashtable 0 instance 015739fc systemKey
源代码网推荐  7912d8f8 4000006 14 System.Object[] 0 instance 01573ac4 leaders
源代码网推荐  790fd0f0 4000007 18 System.Object 0 instance 01573930 previousOne
源代码网推荐  00413364 4000008 1c SOSBasics.Zion 0 instance 01573af0 zion
源代码网推荐  首先映入眼帘的,是Name: SOSBasics.MatrixWorld,这表明这个对象的class name,剩下的几行,我们暂且不用管它。看下面的这个table。该table一共有7个列,分别是MethodTable, field, offset, type, VirtulTable, Attribute, value和name。每行的内容,就是我们当前正在扒皮的object 01573750的内容。
源代码网推荐  命令!do最牛的地方是,所有的托管资源都可以这么看。so,我们先看看第一行的generation。哦,它已经有值了,就是6,看一下我的代码,6表明当前的NEO是第六代就是主,看第二行,是gold,值是123456789,而且类型是double。那么看第三行,是name,它的value是什么呢?是01573780 !
源代码网推荐  这是虾米东东?这也是一个managed object,so,我们继续用do来看它。
源代码网推荐  0:000> !do 01573780
源代码网推荐  Name: System.String
源代码网推荐  MethodTable: 790fd8c4
源代码网推荐  EEClass: 790fd824
源代码网推荐  Size: 38(0x26) bytes
源代码网推荐   (C:WindowsassemblyGAC_32mscorlib2.0.0.0__b77a5c561934e089mscorlib.dll)
源代码网推荐  String: The Matrix
源代码网推荐  Fields:
源代码网推荐   MT Field Offset Type VT Attr Value Name
源代码网推荐  79102290 4000096 4 System.Int32 0 instance 11 m_arrayLength
源代码网推荐  79102290 4000097 8 System.Int32 0 instance 10 m_stringLength
源代码网推荐  790ff328 4000098 c System.Char 0 instance 54 m_firstChar
源代码网推荐  790fd8c4 4000099 10 System.String 0 shared static Empty
源代码网推荐   >> Domain:Value 004b54a8:790d884c <<
源代码网推荐  7912dd40 400009a 14 System.Char[] 0 shared static WhitespaceChars
源代码网推荐   >> Domain:Value 004b54a8:01521470 <<
源代码网推荐  
源代码网推荐  注意红色部分!表明它是一个字符串,值是:The Matrix。你仔细看这个table,发现一个普通的字符串,里面也有东西,有什么arraylength,stringlength等。这个我们先不管,回到上一个table,继续看。
源代码网推荐  
源代码网推荐  name下面是age,地址是01573774,继续!do 01573774 ,哦,为什么出错了呢?
源代码网推荐  0:000> !do 01573774
源代码网推荐  <Note: this object has an invalid CLASS field>
源代码网推荐  Invalid object
源代码网推荐  为虾米是一个无效的对象呢?我们可以用!help dumpobj来看命令的帮助
源代码网推荐  The column VT contains the value 1 if the field is a valuetype structure, and
源代码网推荐  0 if the field contains a pointer to another object. For valuetypes, you can
源代码网推荐  take the MethodTable pointer in the MT column, and the Value and pass them to
源代码网推荐  the command !DumpVC.
源代码网推荐  再看一下上面那个table摘录下来的这个dataetime的东西
源代码网推荐  7910c878 4000004 24 System.DateTime 1 instance 01573774 age
源代码网推荐  
源代码网推荐  ok,偶明白了。这个DateTime的VT列是1,so,我们需要换一个命令来看:!dumpvc,它需要两个参数,一个是对应的methodtable,一个是当前的value。而methodtable就是最左面那个值,value就是最右面倒数第二个的值。so,重新用!dumpvc 7910c878 01573774 来看结果:
源代码网推荐  0:000> !dumpvc 7910c878 01573774
源代码网推荐  Name: System.DateTime
源代码网推荐  MethodTable 7910c878
源代码网推荐  EEClass: 7910c7d8
源代码网推荐  Size: 16(0x10) bytes
源代码网推荐   (C:WindowsassemblyGAC_32mscorlib2.0.0.0__b77a5c561934e089mscorlib.dll)
源代码网推荐  Fields:
源代码网推荐   MT Field Offset Type VT Attr Value Name
源代码网推荐  7910c19c 40000f4 0 System.UInt64 0 instance 662065056000000000 dateData
源代码网推荐  7912d7c0 40000f0 30 System.Int32[] 0 shared static DaysToMonth365
源代码网推荐   >> Domain:Value 004b54a8:0157397c <<
源代码网推荐  7912d7c0 40000f1 34 System.Int32[] 0 shared static DaysToMonth366
源代码网推荐   >> Domain:Value 004b54a8:015739bc <<
源代码网推荐  7910c878 40000f2 28 System.DateTime 1 shared static MinValue
源代码网推荐   >> Domain:Value 004b54a8:0157395c <<
源代码网推荐  7910c878 40000f3 2c System.DateTime 1 shared static MaxValue
源代码网推荐   >> Domain:Value 004b54a8:0157396c <<
源代码网推荐  好长一坨,第一行看那个System.UInt64就是我们的时间,谁有兴趣就算一下。应该是一个ticket(我猜的)
源代码网推荐  我们继续看015739fc systemKey这行,同样,!do 015739fc,也是一大坨!
源代码网推荐  0:000> !do 015739fc
源代码网推荐  Name: System.Collections.Hashtable
源代码网推荐  MethodTable: 79101fe4
源代码网推荐  EEClass: 79101f74
源代码网推荐  Size: 56(0x38) bytes
源代码网推荐   (C:WindowsassemblyGAC_32mscorlib2.0.0.0__b77a5c561934e089mscorlib.dll)
源代码网推荐  Fields:
源代码网推荐   MT Field Offset Type VT Attr Value Name
源代码网推荐  7912d9bc 400092b 4 ...ashtable+bucket[] 0 instance 01573a34 buckets
源代码网推荐  79102290 400092c 1c System.Int32 0 instance 3 count
源代码网推荐  79102290 400092d 20 System.Int32 0 instance 1 occupancy
源代码网推荐  79102290 400092e 24 System.Int32 0 instance 7 loadsize
源代码网推荐  7910790c 400092f 28 System.Single 0 instance 0.720000 loadFactor
源代码网推荐  79102290 4000930 2c System.Int32 0 instance 3 version
源代码网推荐  7910be50 4000931 30 System.Boolean 0 instance 0 isWriterInProgress
源代码网推荐  79107ef8 4000932 8 ...tions.ICollection 0 instance 01575fcc keys
源代码网推荐  79107ef8 4000933 c ...tions.ICollection 0 instance 00000000 values
源代码网推荐  79116ef8 4000934 10 ...IEqualityComparer 0 instance 00000000 _keycomparer
源代码网推荐  790fd0f0 4000935 14 System.Object 0 instance 00000000 _syncRoot
源代码网推荐  79111df0 4000936 18 ...SerializationInfo 0 instance 00000000 m_siInfo
源代码网推荐  有几个东西比较有意思。
源代码网推荐  第二行的Count,是3,表明我们的hashtable里面有3个东西。倒数第五行和倒数第四行,分别是keys和values,我们继续看一下吧!先看keys,!do 01575fcc
源代码网推荐  0:000> !do 01575fcc
源代码网推荐  Name: System.Collections.Hashtable+KeyCollection
源代码网推荐  MethodTable: 7911cd80
源代码网推荐  EEClass: 791fb9e8
源代码网推荐  Size: 12(0xc) bytes
源代码网推荐   (C:WindowsassemblyGAC_32mscorlib2.0.0.0__b77a5c561934e089mscorlib.dll)
源代码网推荐  Fields:
源代码网推荐   MT Field Offset Type VT Attr Value Name
源代码网推荐  79101fe4 400093a 4 ...ections.Hashtable 0 instance 015739fc _hashtable
源代码网推荐  
源代码网推荐  奇怪了!为什么do出来只有一行?我明明有三行数据啊!而且这个value=015739fc,怎么这么眼熟呢?哈!这不就是上面的hashtable嘛!怎么绕来绕去又回来了呢?
源代码网推荐  ok,我们开始看下一个命令:dd。
源代码网推荐  重新看hashtable的第一行:7912d9bc 400092b 4 ...ashtable+bucket[] 0 instance 01573a34 buckets,这里有一个buckets。地址是01573a34,那么用dd来看一下:
源代码网推荐  0:000> dd 01573a34
源代码网推荐  01573a34 7912d9bc 0000000b 00000000 00000000
源代码网推荐  01573a44 00000000 00000000 00000000 00000000
源代码网推荐  01573a54 00000000 00000000 00000000 015737a8
源代码网推荐  01573a64 015737c8 e047abd0 00000000 00000000
源代码网推荐  01573a74 00000000 00000000 00000000 00000000
源代码网推荐  01573a84 00000000 00000000 00000000 00000000
源代码网推荐  01573a94 00000000 00000000 00000000 00000000
源代码网推荐  01573aa4 00000000 015737e8 0157380c 62e0f252
源代码网推荐  0:000> dd
源代码网推荐  01573ab4 01573844 01573860 742f0848 00000000
源代码网推荐  01573ac4 7912d8f8 00000007 790fd8c4 01573880
源代码网推荐  01573ad4 01573898 015738b0 015738c8 015738e0
源代码网推荐  01573ae4 015738f8 01573910 00000000 00413364
源代码网推荐  01573af4 015738f8 00000000 791013a0 00000000
源代码网推荐  01573b04 00000000 00000000 00000000 00000000
源代码网推荐  01573b14 00000000 790fd0f0 00000000 40010000
源代码网推荐  01573b24 79101444 0000000b 00000004 00000100
源代码网推荐  注意上面红色部分,第一个0000000b,表明这个hashtable有11个对象,为啥这么多?我不知道。我们看其他的
源代码网推荐  0:000> !do -nofields 015737a8
源代码网推荐  Name: System.String
源代码网推荐  MethodTable: 790fd8c4
源代码网推荐  EEClass: 790fd824
源代码网推荐  Size: 30(0x1e) bytes
源代码网推荐   (C:WindowsassemblyGAC_32mscorlib2.0.0.0__b77a5c561934e089mscorlib.dll)
源代码网推荐  String: Oracle
源代码网推荐  0:000> !do -nofields 015737c8
源代码网推荐  Name: System.String
源代码网推荐  MethodTable: 790fd8c4
源代码网推荐  EEClass: 790fd824
源代码网推荐  Size: 32(0x20) bytes
源代码网推荐   (C:WindowsassemblyGAC_32mscorlib2.0.0.0__b77a5c561934e089mscorlib.dll)
源代码网推荐  String: 会变脸的老女人
源代码网推荐  看到了?我们的key是oracle,值是:会变脸的老女人。这里的do多了一个参数,叫做-nofields,对于string这些类型,能输出的少点,看起来就舒服一点。类似的,我们能看到剩余的2对key/value。
源代码网推荐  
源代码网推荐  Hashtable暂时告一段落,我们继续回到第一个table里面,看Matrixworld里面其他的对象。
源代码网推荐  7912d8f8 4000006 14 System.Object[] 0 instance 01573ac4 leaders
源代码网推荐  leaders,这是一个System.Object[]数组类型,我们do一下:!do 01573ac4
源代码网推荐  0:000> !do 01573ac4
源代码网推荐  Name: System.Object[]
源代码网推荐  MethodTable: 7912d8f8
源代码网推荐  EEClass: 7912de6c
源代码网推荐  Size: 44(0x2c) bytes
源代码网推荐  Array: Rank 1, Number of elements 7, Type CLASS
源代码网推荐  Element Type: System.String
源代码网推荐  Fields:
源代码网推荐  None
源代码网推荐  显然,不是我们想要的结果,所了一堆废话而已:一维数组,7个元素,都是string类型的。那么每个元素的内容是什么呢?对于数组,我们可以用!da命令来看(叹号+da)。!da 01573ac4结果如下:
源代码网推荐  0:000> !da 01573ac4
源代码网推荐  Name: System.String[]
源代码网推荐  MethodTable: 7912d8f8
源代码网推荐  EEClass: 7912de6c
源代码网推荐  Size: 44(0x2c) bytes
源代码网推荐  Array: Rank 1, Number of elements 7, Type CLASS
源代码网推荐  Element Methodtable: 790fd8c4
源代码网推荐  [0] 01573880
源代码网推荐  [1] 01573898
源代码网推荐  [2] 015738b0
源代码网推荐  [3] 015738c8
源代码网推荐  [4] 015738e0
源代码网推荐  [5] 015738f8
源代码网推荐  [6] 01573910
源代码网推荐  嗯,very cool!一共7个都出来了,我们随便do一个,比如说最后一个:!do -nofields 01573910
源代码网推荐  0:000> !do -nofields 01573910
源代码网推荐  Name: System.String
源代码网推荐  MethodTable: 790fd8c4
源代码网推荐  EEClass: 790fd824
源代码网推荐  Size: 32(0x20) bytes
源代码网推荐   (C:WindowsassemblyGAC_32mscorlib2.0.0.0__b77a5c561934e089mscorlib.dll)
源代码网推荐  String: 那个印度小女孩
源代码网推荐  哈,第七代救世主,那个印度小女孩。同理,其他的也能出来。
源代码网推荐  
源代码网推荐  慢着,如果数组里面有百八十个,这么看,岂不是要累死吗?我们!help dumparray,看一下帮助,哦,有一个参数可以用,叫做-details。那么我们可以这么下da命令:!da -details 01573ac4 ,具体的联系,留给大家,不在这里占用版面了。
源代码网推荐  
源代码网推荐  好!加油,感谢大家能看到这里,这么多copy/paste的结果,实在不好意思,嘿嘿。
源代码网推荐  现在继续看00413364 4000008 1c SOSBasics.Zion 0 instance 01573af0 zion,哦,这是我们定义的第二个class:Zion,它也是人,so,do命令照样好使。!do 01573af0
源代码网推荐  0:000> !do 01573af0
源代码网推荐  Name: SOSBasics.Zion
源代码网推荐  MethodTable: 00413364
源代码网推荐  EEClass: 004118ec
源代码网推荐  Size: 12(0xc) bytes
源代码网推荐   (c:UserscharjuDocumentsVisual Studio 2008ProjectsBasicWindbgSOSBasicsSOSBasicsinDebugSOSBasics.exe)
源代码网推荐  Fields:
源代码网推荐   MT Field Offset Type VT Attr Value Name
源代码网推荐  790fd8c4 4000009 4 System.String 0 instance 015738f8 one
源代码网推荐  很强大!只有一个field,就是我们的one,对于它,继续do:!do -nofields 015738f8
源代码网推荐  0:000> !do -nofields 015738f8
源代码网推荐  Name: System.String
源代码网推荐  MethodTable: 790fd8c4
源代码网推荐  EEClass: 790fd824
源代码网推荐  Size: 24(0x18) bytes
源代码网推荐   (C:WindowsassemblyGAC_32mscorlib2.0.0.0__b77a5c561934e089mscorlib.dll)
源代码网推荐  String: NEO
源代码网推荐  
源代码网推荐  cool!!!找到NEO了!(上面输出的最后一行)
源代码网推荐  
源代码网推荐  我们的do之旅也看就要完成了,坚持一下,看最后的一个,倒数第二个的信息:790fd0f0 4000007 18 System.Object 0 instance 01573930 previousOne
源代码网推荐  0:000> !do 01573930
源代码网推荐  Name: System.String
源代码网推荐  MethodTable: 790fd8c4
源代码网推荐  EEClass: 790fd824
源代码网推荐  Size: 42(0x2a) bytes
源代码网推荐   (C:WindowsassemblyGAC_32mscorlib2.0.0.0__b77a5c561934e089mscorlib.dll)
源代码网推荐  String: NEO的前身,不知道是谁
源代码网推荐  Fields:
源代码网推荐   MT Field Offset Type VT Attr Value Name
源代码网推荐  79102290 4000096 4 System.Int32 0 instance 13 m_arrayLength
源代码网推荐  79102290 4000097 8 System.Int32 0 instance 12 m_stringLength
源代码网推荐  790ff328 4000098 c System.Char 0 instance 4e m_firstChar
源代码网推荐  790fd8c4 4000099 10 System.String 0 shared static Empty
源代码网推荐   >> Domain:Value 004b54a8:790d884c <<
源代码网推荐  7912dd40 400009a 14 System.Char[] 0 shared static WhitespaceChars
源代码网推荐   >> Domain:Value 004b54a8:01521470 <<
源代码网推荐  
源代码网推荐  小菜一碟,这也是一个字符串,是neo的前身。
源代码网推荐  
源代码网推荐  (晕死,第一部分还没有结束,再开一个帖子,我们继续看heap上的东西)
源代码网推荐  
源代码网推荐    做人要厚道,请注明转自酷网动力(www.ASPCOOL.COM)。
源代码网推荐


源代码网供稿.
网友评论 (0)
会员中心
网络编程
本站推荐
网络编程之精华