Question

I'm trying to debug a .NET managed code application for educational purposes with WinDbg and SOS.

Module Module1

  Sub Main()

    Console.Read()
    throwExceptionMethod()

  End Sub

  Private Sub throwExceptionMethod()

    Dim localString As String = "bad string"
    If localString = "bad string" Then
      Throw New System.NotSupportedException("Can't process the string.")
    End If

  End Sub

End Module

When compiled in debug mode I can see the method throwing the exception and the local string which broke my application.

Output of !CLRStack command:

0:000> !CLRStack
OS Thread Id: 0x1148 (0)
DBGHELP: mscorwks - public symbols
         C:\Program Files\Debugging Tools for Windows (x64)\sym\mscorwks.pdb\EC7B2AF3D7A74E1FB2A04CB8AF5F867A1\mscorwks.pdb
DBGHELP: ntdll - public symbols
         C:\Program Files\Debugging Tools for Windows (x64)\sym\ntdll.pdb\9D04EB0AA387494FBD81ED062072B99C2\ntdll.pdb
DBGHELP: mscoreei - public symbols
         C:\Program Files\Debugging Tools for Windows (x64)\sym\mscoreei.pdb\F2445BD7B5494942A39C87ED630879A92\mscoreei.pdb
DBGHELP: MSCOREE - public symbols
         C:\Program Files\Debugging Tools for Windows (x64)\sym\mscoree.pdb\FB53EF9DD104439E9903F0B34128E0392\mscoree.pdb
DBGHELP: KERNEL32 - public symbols
         C:\Program Files\Debugging Tools for Windows (x64)\sym\kernel32.pdb\C4D1D9065632419699A8B2F25B62381D2\kernel32.pdb
Child-SP         RetAddr          Call Site
000000000020ec70 000007ff0019014a Prototipos.Module1.throwExceptionMethod()
000000000020ecc0 000007fef881d432 Prototipos.Module1.Main()

And the local string which the method is unable to process.

Output of !dso and !do 00000000027002c0:

0:000> !dso
OS Thread Id: 0x1148 (0)
RSP/REG          Object           Name
000000000020ea80 00000000026ff4c8 System.Text.DecoderNLS
000000000020eaa8 0000000002700340 System.NotSupportedException
000000000020eac0 0000000002700340 System.NotSupportedException
000000000020eae0 0000000002700340 System.NotSupportedException
000000000020ebb0 0000000002700340 System.NotSupportedException
000000000020ebc0 00000000027002f0 System.String
000000000020ec60 00000000027002f0 System.String
000000000020ec90 00000000027002c0 System.String
000000000020eca8 0000000002700340 System.NotSupportedException
000000000020ecc0 00000000026ff828 System.IO.TextReader+SyncTextReader

0:000> !do 00000000027002c0
Name: System.String
MethodTable: 000007fef7ab7d90
EEClass: 000007fef76be560
Size: 46(0x2e) bytes
 (C:\Windows\assembly\GAC_64\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll)
String: bad string
Fields:
              MT    Field   Offset                 Type VT     Attr            Value Name
000007fef7abf000  4000096        8         System.Int32  1 instance               11 m_arrayLength
000007fef7abf000  4000097        c         System.Int32  1 instance               10 m_stringLength
000007fef7ab97d8  4000098       10          System.Char  1 instance               62 m_firstChar
000007fef7ab7d90  4000099       20        System.String  0   shared           static Empty
                                 >> Domain:Value  00000000000bac20:00000000026f1308 <<
000007fef7ab9688  400009a       28        System.Char[]  0   shared           static WhitespaceChars
                                 >> Domain:Value  00000000000bac20:00000000026f1ba0 <<

But in release mode, even with pdb loaded, I can't see useful information with WinDbg.

Output of module information. Symbols are loaded:

0:000> !lmi Prototipos.exe
Loaded Module Info: [prototipos.exe]
         Module: Prototipos
   Base Address: 0000000000940000
     Image Name: C:\Users\joseluis.vaquero\Documents\Visual Studio 2008\Projects\Prototipos\Prototipos\bin\Release\Prototipos.exe
   Machine Type: 332 (I386)
     Time Stamp: 52e64b75 Mon Jan 27 13:05:09 2014
           Size: a000
       CheckSum: 0
Characteristics: 102
Debug Data Dirs: Type  Size     VA  Pointer
             CODEVIEW    89,  401c,    1c1c RSDS - GUID: {ABB91DE1-4132-4D69-B9E7-2D48B4C9A548}
               Age: 1, Pdb: C:\Users\joseluis.vaquero\Documents\Visual Studio 2008\Projects\Prototipos\Prototipos\obj\Release\Prototipos.pdb
     Image Type: FILE     - Image read successfully from debugger.
                 C:\Users\joseluis.vaquero\Documents\Visual Studio 2008\Projects\Prototipos\Prototipos\bin\Release\Prototipos.exe
    Symbol Type: PDB      - Symbols loaded successfully from image path.
                 C:\Users\joseluis.vaquero\Documents\Visual Studio 2008\Projects\Prototipos\Prototipos\bin\Release\Prototipos.pdb
    Load Report: private symbols & lines, not source indexed
                 C:\Users\joseluis.vaquero\Documents\Visual Studio 2008\Projects\Prototipos\Prototipos\bin\Release\Prototipos.pdb

I can't see the ThrowExcetionMethod in Stack.

0:000> !CLRStack
OS Thread Id: 0xae4 (0)
Child-SP         RetAddr          Call Site
00000000001fe920 000007fef881d432 Prototipos.Module1.Main()

I can't see local string dumping stack objects.

0:000> !dso
OS Thread Id: 0xae4 (0)
RSP/REG          Object           Name
00000000001fe758 000000000268a840 System.NotImplementedException
00000000001fe770 000000000268a840 System.NotImplementedException
00000000001fe790 000000000268a840 System.NotImplementedException
00000000001fe860 000000000268a840 System.NotImplementedException
00000000001fe870 000000000268a840 System.NotImplementedException
00000000001fe910 000000000268a840 System.NotImplementedException
00000000001fe920 000000000268a840 System.NotImplementedException
00000000001fe928 000000000268a8c8 System.String

I'm unable to discover what is happening in a production environment with this information.

Is there an way to get more information with WinDbg in release mode?

Was it helpful?

Solution

This is entirely normal, a side effect of the jitter optimizer making your code fast. The method disappeared because it got inlined, the stack variables disappeared because they are stored in CPU registers instead. You'll find the kind of optimizations performed by the jitter in this answer.

If you strongly favor diagnosability over speed then disabling the optimizer is technically an option. Select the Release build configuration, Project + Properties, Compiled tab, Advanced button, untick the "Enable optimizations" option. Not that I actually recommend you doing this btw.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top