Debugging Tip: Dump the XML from System.Xml.XmlReader object


In a recent case, I had a difficult time in debugging to find the payload associated with XmlReader.  I am sharing what all I have done to get to the correct parameter.

 

Overall, XmlReader just acts as a pointer.

MSDN definition of System.Xml.XmlReader does not talk much where we can find the full XML associated with it.

I used netext (http://netext.codeplex.com/) extension to debug on this.

 

0:001> .load netext

0:001> !windex –tree  

Now, investigate what this thread is doing. From callstack, it is clear that certain XML read operation is underway. I am not sharing the callstack details out here as it is common to grab callstacks (by using command k or kL).

 

0:001> !wstack  

.

.

021b4fd8 70ba4c90   0  0         12 System.Xml.XmlTextReader

.

. 

Now, dump System.Xml.XmlTextReader object

0:001> !wdo 021b4fd8

.

70ba4690                     System.Xml.XmlTextReaderImpl +0000                                     impl 021b508c

 

Now, dump System.Xml.XmlTextReaderImpl object 

0:001> !wdo 021b508c

73db05f4                                     System.Int64 +0000                  maxCharactersInDocument 0 (0n0)

73db05f4                                     System.Int64 +0008                maxCharactersFromEntities 989680 (0n10000000)

73db05f4                                     System.Int64 +0010                     charactersInDocument 0 (0n0)

73db05f4                                     System.Int64 +0018                   charactersFromEntities 0 (0n0)

70ba4524         System.Xml.XmlTextReaderImpl+LaterInitPa +0020                           laterInitParam 00000000

73d60cbc                                  System.Object[] +0024                                    nodes 021b6828

70ba497c            System.Xml.XmlTextReaderImpl+NodeData +0028                                  curNode 021db6d0

73d60cbc                                  System.Object[] +002c                     attrDuplSortingArray 00000000

70b862fc                          System.Xml.XmlNameTable +0030                                nameTable 021b4fe4

70b84be0                           System.Xml.XmlResolver +0034                              xmlResolver 021b67ec

73da3e18                                    System.String +0038                                      url 021b2394 ../../../../SavedFiles/Version2NoOrder.xml

73d9d0a8                 System.Threading.CompressedStack +003c                          compressedStack 021b6a88

70ba487c                   System.Xml.XmlNamespaceManager +0040                         namespaceManager 021b690c

73da3e18                                    System.String +0044                               lastPrefix 021db6ac i

70ba49d0          System.Xml.XmlTextReaderImpl+XmlContext +0048                               xmlContext 021dba48

7104db58         System.Xml.XmlTextReaderImpl+ParsingStat +004c                       parsingStatesStack 00000000

73da3e18                                    System.String +0050                          reportedBaseUri 021b7c9c file:///D:/Sample/SavedFiles/Version2NoOrder.xml

73da5e9c                             System.Text.Encoding +0054                         reportedEncoding 021db614

70b8c258                              System.Xml.IDtdInfo +0058                                  dtdInfo 00000000

70b860fc                      System.Xml.XmlParserContext +005c                    fragmentParserContext 00000000

70b963e8                System.Xml.IncrementalReadDecoder +0060                           incReadDecoder 00000000

70b94d68                         System.Xml.BinHexDecoder +0064                            binHexDecoder 00000000

70ba2f84                         System.Xml.Base64Decoder +0068                            base64Decoder 00000000

70b95334           System.Xml.IncrementalReadCharsDecoder +006c                         readCharsDecoder 00000000

70b92a48              System.Xml.IValidationEventHandling +0070                  validationEventHandling 00000000

70b9888c         System.Xml.XmlTextReaderImpl+OnDefaultAt +0074                    onDefaultAttributeUse 00000000

73da660c                        System.Text.StringBuilder +0078                            stringBuilder 021b68ac

70b99c5c                        System.Xml.IDtdEntityInfo +007c                               lastEntity 00000000

73da41b8                                    System.Object +0080                          currentEntities 00000000

70ba4e50                             System.Xml.XmlReader +0084                              outerReader 021b4fd8

73da3e18                                    System.String +0088                                      Xml 021b5200 xml

73da3e18                                    System.String +008c                                    XmlNs 021b5214 xmlns

70b9746c         System.Xml.XmlTextReaderImpl+ParseTextSt +0090                       lastParseTextState 00000000

73db0bfc         System.Threading.Tasks.Task<System.Tuple +0094                      parseText_dummyTask 021b52e0

70b95ddc         System.Xml.XmlTextReaderImpl+ParsingFunc +0098                          parsingFunction 8 (0n8) PopEmptyElementContext

70b95ddc         System.Xml.XmlTextReaderImpl+ParsingFunc +009c                      nextParsingFunction 0 (0n0) ElementContent

70b95ddc         System.Xml.XmlTextReaderImpl+ParsingFunc +00a0                  nextNextParsingFunction 0 (0n0) ElementContent

73da560c                                     System.Int32 +00a4                                    index 1 (0n1)

73da560c                                     System.Int32 +00a8                             curAttrIndex ffffffff (0n-1)

73da560c                                     System.Int32 +00ac                                attrCount 2 (0n2)

73da560c                                     System.Int32 +00b0                            attrHashtable 44000 (0n278528)

73da560c                                     System.Int32 +00b4                        attrDuplWalkCount 0 (0n0)

70ba45c0                    System.Xml.WhitespaceHandling +00b8                       whitespaceHandling 0 (0n0) All

70ba43f8                         System.Xml.DtdProcessing +00bc                            dtdProcessing 2 (0n2) Parse

70b8f5a8                        System.Xml.EntityHandling +00c0                           entityHandling 2 (0n2) ExpandCharEntities

73da560c                                     System.Int32 +00c4                         lineNumberOffset 0 (0n0)

73da560c                                     System.Int32 +00c8                       linePositionOffset 0 (0n0)

73da560c                                     System.Int32 +00cc                    parsingStatesStackTop ffffffff (0n-1)

70ba4b10                           System.Xml.XmlNodeType +00d0                             fragmentType 9 (0n9) Document

70b96f20         System.Xml.XmlTextReaderImpl+Incremental +00d4                             incReadState 0 (0n0) Text

73da560c                                     System.Int32 +00d8                             incReadDepth 0 (0n0)

73da560c                                     System.Int32 +00dc                      incReadLeftStartPos 0 (0n0)

73da560c                                     System.Int32 +00e0                        incReadLeftEndPos 0 (0n0)

73da560c                                     System.Int32 +00e4               attributeValueBaseEntityId 0 (0n0)

73da560c                                     System.Int32 +00e8                             nextEntityId 1 (0n1)

70b9f5e0         System.Xml.XmlTextReaderImpl+ParsingMode +00ec                              parsingMode 0 (0n0) Full

70b860b8                             System.Xml.ReadState +00f0                                readState 1 (0n1) Interactive

73da560c                                     System.Int32 +00f4                     documentStartBytePos 0 (0n0)

73da560c                                     System.Int32 +00f8                          readValueOffset 0 (0n0)

70b99a58         System.Xml.XmlTextReaderImpl+ParseEndEle +00fc                 parseEndElement_NextFunc 0 (0n0) CheckEndTag

70b91568         System.Xml.XmlTextReaderImpl+ParseTextFu +0100                   parseText_NextFunction 0 (0n0) ParseText

73daf91c                                   System.Boolean +0104                                 useAsync 0 (False)

73daf91c                                   System.Boolean +0105                  attrNeedNamespaceLookup 0 (False)

73daf91c                                   System.Boolean +0106                          fullAttrCleanup 0 (False)

73daf91c                                   System.Boolean +0107                    nameTableFromSettings 0 (False)

73daf91c                                   System.Boolean +0108                                normalize 0 (False)

73daf91c                                   System.Boolean +0109                        supportNamespaces 1 (True)

73daf91c                                   System.Boolean +010a                                ignorePIs 0 (False)

73daf91c                                   System.Boolean +010b                           ignoreComments 0 (False)

73daf91c                                   System.Boolean +010c                          checkCharacters 0 (False)

73daf91c                                   System.Boolean +010d                               closeInput 1 (True)

73daf91c                                   System.Boolean +010e                                 v1Compat 1 (True)

73daf91c                                   System.Boolean +010f                                 fragment 0 (False)

73daf91c                                   System.Boolean +0110           emptyEntityInAttributeResolved 0 (False)

73daf91c                                   System.Boolean +0111               validatingReaderCompatFlag 0 (False)

73daf91c                                   System.Boolean +0112         addDefaultAttributesAndNormalize 0 (False)

73daf91c                                   System.Boolean +0113                        rootElementParsed 1 (True)

73daf91c                                   System.Boolean +0114                               standalone 0 (False)

73daf91c                                   System.Boolean +0115                          afterResetState 0 (False)

73daf91c                                   System.Boolean +0116             disableUndeclaredEntityCheck 0 (False)

73daf91c                                   System.Boolean +0117                         xmlResolverIsSet 0 (False)

70ba4fe0                           System.Xml.XmlCharType +0118                              xmlCharType -mt 70BA4FE0 00000000

70ba4ab8         System.Xml.XmlTextReaderImpl+ParsingStat +011c                                       ps -mt 70BA4AB8 00000000

70b9e430                              System.Xml.LineInfo +0164                          incReadLineInfo -mt 70B9E430 00000000

 

Now, dump System.Xml.XmlTextReaderImpl+NodeData object 

0:001> !wdo 021db6d0

73da3e18                                    System.String +0000                                localName 021eb61c Person

73da3e18                                    System.String +0004                                   prefix 021b1228

73da3e18                                    System.String +0008                                       ns 021dba0c Tests.FCTests

73da3e18                                    System.String +000c                              nameWPrefix 021eb61c Person

73da3e18                                    System.String +0010                                    value 021b1228

73da47d8                                    System.Char[] +0014                                    chars 021db2c8

70ba497c            System.Xml.XmlTextReaderImpl+NodeData +0018                       nextAttrValueChunk 00000000

73da41b8                                    System.Object +001c                               schemaType 00000000

73da41b8                                    System.Object +0020                               typedValue 00000000

70ba4b10                           System.Xml.XmlNodeType +0024                                     type 1 (0n1) Element

73da560c                                     System.Int32 +0028                            valueStartPos ffffffff (0n-1)

73da560c                                     System.Int32 +002c                              valueLength 4 (0n4)

73da560c                                     System.Int32 +0030                                    depth 1 (0n1)

73da560c                                     System.Int32 +0034                                 entityId 0 (0n0)

73da4810                                      System.Char +0038                                quoteChar "

73daf91c                                   System.Boolean +003a                         isEmptyOrDefault 1 (True)

73daf91c                                   System.Boolean +003b                         xmlContextPushed 0 (False)

70b9e430                              System.Xml.LineInfo +003c                                 lineInfo -mt 70B9E430 00000000

70b9e430                              System.Xml.LineInfo +0044                                lineInfo2 -mt 70B9E430 00000000

70ba497c Static     System.Xml.XmlTextReaderImpl+NodeData +0090                                   s_None 021d1dfc

 

Now, dump System.Char[] object 

0:001> !wdo 021db2c8

.

Data Start: 021db2d0

<People xmlns:i="http://www.w3.org/2001/XMLSchema-instance" z:Id="1" xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/" xmlns="Tests.FCTests">

  <AnotherPerson z:Id="2" i:type="AnotherPerson">

    <FriendPerson z:Id="3">

      <Name z:Id="4">Person</Name>

    </FriendPerson>

    <Name z:Id="5">AnotherPerson</Name>

  </AnotherPerson>

  <Person z:Ref="3" i:nil="true" />

</People>

 

Now, we have found out the XML payload contained in the XmlReader object.

SOS extension can also be used the same way (it is just the commands will be different). 

Pre-requisite: Windbg tool must be installed (reference: http://blogs.msdn.com/b/rodneyviana/archive/2015/03/10/getting-started-with-netext.aspx) 

  

Happy debugging … I hope this helps!

Comments (1)

  1. SpatDSG says:

    Hey neat extension tip and link - learned something new and this was helpful today - thanks!

Skip to main content