Troubleshooting SQL Server Management Studio with SQL Profiler and Debugging Tools – Part 3

(An alternate title for this post could be “How to debug SSMS managed code”)

In the first 2 posts of this topic we used SQL Profiler and some common sense to diagnose a problem within SSMS. Then we used DebugDiag to collect a memory dump when a specific exception was thrown. Now in the 3rd part we’ll analyze that dump used windbg and public symbols from the Microsoft symbols server.

This post assumes a certain familiarity with managed debugging using windbg. If you need some background on this topic, a good place to start is by reading the blog of Tess.

To understand the context of this debugging, you should really read the first 2 posts in the series, but as a brief reminder, we collect a dump of the SSMS process (ssms.exe in SQL 2008 and sqlwb.exe in SQL 2005) when a specific condition occurs – in this case an exception thrown when trying to view SQL Agent job history. The dump below is from a sqlwb.exe 2005 client, but the theory is identical. The main point which this post demonstrates is that unlike when debugging the database engine process of SQL Server (sqlservr.exe), using purely public symbols , interesting information can be gleaned from the dump because most of the interesting structures are in managed code which can be interpretted with the windbg extension sos.dll.

My base setup for this debugging:

A blank hyper-V machine running Windows 7 Ultimate, connected to the internet

A default installation of debugging tools for windows downloaded from here:

https://www.microsoft.com/whdc/devtools/debugging/installx86.Mspx

A symbol path set exactly as per the example “getting started” page here:

https://www.microsoft.com/whdc/devtools/debugging/debugstart.mspx

i.e. the symbol path used is:

SRV*c:\websymbols*https://msdl.microsoft.com/download/symbols

So here’s the debugging output with notes:

* First off we load the public sos.dll so we can do managed debugging

0:018> .load c:\windows\microsoft.net\framework\v2.0.50727\sos.dll

* We’ve opened directly to the thread where the exception occurred

* let’s look at the CLRSTACK

0:018> !clrstack

OS Thread Id: 0x6ac (18)

ESP EIP

0822ef3c 77e4bef7 [HelperMethodFrame: 0822ef3c]

0822efe0 799d766a System.DateTime.TimeToTicks(Int32, Int32, Int32)

0822eff0 2ec8e92c Microsoft.SqlServer.Management.Smo.PostProcessCreateDateTime.GetDateTime(System.Object, System.Object)

0822f010 2ec91584 Microsoft.SqlServer.Management.Smo.PostProcessJobActivity.GetColumnData(System.String, System.Object, Microsoft.SqlServer.Management.Smo.DataProvider)

0822f064 2ec86ced Microsoft.SqlServer.Management.Smo.DataProvider.ManipulateRowDataPostProcess()

0822f07c 2ec872b9 Microsoft.SqlServer.Management.Smo.DataProvider.GetTable()

0822f08c 2ec84436 Microsoft.SqlServer.Management.Smo.ExecuteSql.ExecuteWithResults(System.Collections.Specialized.StringCollection, System.Object, Microsoft.SqlServer.Management.Smo.StatementBuilder)

0822f098 2ec804db Microsoft.SqlServer.Management.Smo.SqlObjectBase.FillData(Microsoft.SqlServer.Management.Smo.ResultType, System.Collections.Specialized.StringCollection, System.Object, Microsoft.SqlServer.Management.Smo.StatementBuilder)

0822f0b8 2ec803c4 Microsoft.SqlServer.Management.Smo.SqlObjectBase.FillDataWithUseFailure(Microsoft.SqlServer.Management.Smo.SqlEnumResult, Microsoft.SqlServer.Management.Smo.ResultType)

0822f0f8 2ec80339 Microsoft.SqlServer.Management.Smo.SqlObjectBase.BuildResult(Microsoft.SqlServer.Management.Smo.EnumResult)

0822f138 2ec7fea3 Microsoft.SqlServer.Management.Smo.SqlObjectBase.GetData(Microsoft.SqlServer.Management.Smo.EnumResult)

0822f148 2eb5daf8 Microsoft.SqlServer.Management.Smo.Environment.GetData()

0822f178 2eb5da5c Microsoft.SqlServer.Management.Smo.Environment.GetData(Microsoft.SqlServer.Management.Smo.Request, System.Object)

0822f18c 2eb5caef Microsoft.SqlServer.Management.Smo.Enumerator.GetData(System.Object, Microsoft.SqlServer.Management.Smo.Request)

0822f1b0 2eb5ccd6 Microsoft.SqlServer.Management.Smo.Enumerator.Process(System.Object, Microsoft.SqlServer.Management.Smo.Request)

0822f1e4 30983b38 Microsoft.SqlServer.Management.SqlManagerUI.JobFetcher.FetchJobs(System.String)

0822f200 3098349a Microsoft.SqlServer.Management.SqlManagerUI.JobFetcher.FetchJobs(Microsoft.SqlServer.Management.SqlManagerUI.JobActivityFilter)

0822f214 3098230e Microsoft.SqlServer.Management.SqlManagerUI.JobsPanel.RefreshJobs()

0822f240 3097f028 Microsoft.SqlServer.Management.SqlManagerUI.JobActivityMonitor.Microsoft.SqlServer.Management.UI.ActivityMonitor.IActivityMonitor.RefreshSnapshot()

0822f244 053f08f7 Microsoft.SqlServer.Management.UI.ActivityMonitor.ActivityMonitorUserControl.WorkerEntryPoint(System.Object)

0822f280 792c9e4f System.Threading._ThreadPoolWaitCallback.WaitCallback_Context(System.Object)

0822f288 792f5681 System.Threading.ExecutionContext.runTryCode(System.Object)

0822f6b8 79e71b4c [HelperMethodFrame_PROTECTOBJ: 0822f6b8] System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode, CleanupCode, System.Object)

0822f720 792f5577 System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)

0822f73c 792e01c5 System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)

0822f754 792ca3b3 System.Threading._ThreadPoolWaitCallback.PerformWaitCallbackInternal(System.Threading._ThreadPoolWaitCallback)

0822f768 792ca249 System.Threading._ThreadPoolWaitCallback.PerformWaitCallback(System.Object)

0822f8f8 79e71b4c [GCFrame: 0822f8f8]

* this shows us some fairly expected output that we have a stack which indicates we are using SMO to populate some data to do with SQL Agent jobs (Microsoft.SqlServer.Management.SqlManagerUI.JobFetcher.FetchJobs)

* let’s look at the exception to check it’s what we wanted

* it shows the details of the exception which SSMS reported (Hour, Minute, and Second parameters describe an un-representable DateTime)

0:018> !pe

Exception object: 016588b4

Exception type: System.ArgumentOutOfRangeException

Message: Hour, Minute, and Second parameters describe an un-representable DateTime.

InnerException: <none>

StackTrace (generated):

<none>

StackTraceString: <none>

HResult: 80131502

* now we want to look at what these functions were actually doing

* dump all objects on the stack to look back through recent history (most recent is at the top)

* scanning down here to look for anything of interest

* we see that we have a System.DBNull sitting next to a System.String named NextRunDate – this might be of interest

* in addition to that we can see the server connection object which will contain the details of the connection and also the actual TSQL executed

0:018> !dso

OS Thread Id: 0x6ac (18)

ESP/REG Object Name

0822eed0 016588b4 System.ArgumentOutOfRangeException

0822ef1c 016588b4 System.ArgumentOutOfRangeException

0822ef60 016588b4 System.ArgumentOutOfRangeException

0822efbc 0156b85c System.String ArgumentOutOfRange_BadHourMinuteSecond

0822efc4 016588b4 System.ArgumentOutOfRangeException

0822efe0 016588b4 System.ArgumentOutOfRangeException

0822eff8 015cd46c Microsoft.SqlServer.Management.Smo.PostProcessJobActivity

0822effc 0165889c System.Int32

0822f00c 016588a8 System.Int32

0822f010 01658880 System.Data.RBTree`1+RBTreeEnumerator[[System.Data.DataRow, System.Data]]

0822f014 01603e84 System.Data.DataRow

0822f018 015cc064 System.String NextRunDate

0822f01c 015cd46c Microsoft.SqlServer.Management.Smo.PostProcessJobActivity

0822f044 015d34f0 System.Data.DataRow

0822f048 015cd46c Microsoft.SqlServer.Management.Smo.PostProcessJobActivity

0822f04c 015cdf84 Microsoft.SqlServer.Management.Smo.DataProvider

0822f05c 015cdf84 Microsoft.SqlServer.Management.Smo.DataProvider

0822f060 011ee95c System.DBNull

0822f064 015cc064 System.String NextRunDate

0822f068 01597a6c Microsoft.SqlServer.Management.SqlManagerUI.JobFetcher

0822f06c 015cdf84 Microsoft.SqlServer.Management.Smo.DataProvider

0822f094 015ccd18 Microsoft.SqlServer.Management.Smo.StatementBuilder

0822f0b0 01594dbc Microsoft.SqlServer.Management.Common.ServerConnection

0822f0c0 015cd964 System.Collections.Specialized.StringCollection

0822f0c4 015cca78 Microsoft.SqlServer.Management.Smo.SqlEnumResult

0822f0c8 015c8a00 Microsoft.SqlServer.Management.Smo.SqlObject

0822f0e0 01597a6c Microsoft.SqlServer.Management.SqlManagerUI.JobFetcher

0822f124 01597a6c Microsoft.SqlServer.Management.SqlManagerUI.JobFetcher

0822f148 015cc7bc System.Collections.ArrayList+ArrayListEnumeratorSimple

0822f14c 015cca78 Microsoft.SqlServer.Management.Smo.SqlEnumResult

0822f164 01597a6c Microsoft.SqlServer.Management.SqlManagerUI.JobFetcher

0822f168 015c462c Microsoft.SqlServer.Management.Smo.Environment

0822f188 01594dbc Microsoft.SqlServer.Management.Common.ServerConnection

0822f194 01594dbc Microsoft.SqlServer.Management.Common.ServerConnection

0822f19c 01597a6c Microsoft.SqlServer.Management.SqlManagerUI.JobFetcher

0822f1cc 01597a6c Microsoft.SqlServer.Management.SqlManagerUI.JobFetcher

0822f1e0 015c4590 Microsoft.SqlServer.Management.Smo.Request

0822f1e4 0150cb08 System.String /Job

0822f1e8 011d1198 System.String

0822f1ec 0158101c Microsoft.SqlServer.Management.SqlManagerUI.JobActivityFilter

0822f1f0 01597a6c Microsoft.SqlServer.Management.SqlManagerUI.JobFetcher

0822f204 01591e78 Microsoft.SqlServer.Management.SqlManagerUI.JobsPanel

0822f214 01591e78 Microsoft.SqlServer.Management.SqlManagerUI.JobsPanel

0822f21c 01217510 System.Runtime.CompilerServices.RuntimeHelpers+CleanupCode

0822f224 014f9c50 System.Threading.ExecutionContext

0822f250 015a5174 Microsoft.SqlServer.Management.UI.ActivityMonitor.ActivityMonitorUserControl+BackgroundRefreshJobDescription

0822f254 01581054 Microsoft.SqlServer.Management.UI.ActivityMonitor.ActivityMonitorUserControl

0822f344 012174f0 System.Runtime.CompilerServices.RuntimeHelpers+TryCode

0822f410 01217510 System.Runtime.CompilerServices.RuntimeHelpers+CleanupCode

0822f4b8 012174f0 System.Runtime.CompilerServices.RuntimeHelpers+TryCode

0822f638 01217510 System.Runtime.CompilerServices.RuntimeHelpers+CleanupCode

0822f6f4 012174f0 System.Runtime.CompilerServices.RuntimeHelpers+TryCode

0822f6f8 01217510 System.Runtime.CompilerServices.RuntimeHelpers+CleanupCode

0822f6fc 015a561c System.Threading.ExecutionContext+ExecutionContextRunData

0822f724 011f4ecc System.Threading.ContextCallback

0822f72c 014f9c50 System.Threading.ExecutionContext

0822f738 015a51cc System.Threading._ThreadPoolWaitCallback

0822f750 015a51cc System.Threading._ThreadPoolWaitCallback

* dump the server connection object – this is always a useful object to be able to locate and look at, because within it you can see all manner of properties about the connection and the batch executing

0:018> !do 01594dbc

Name: Microsoft.SqlServer.Management.Common.ServerConnection

MethodTable: 2e2bda28

EEClass: 2e283d48

Size: 144(0x90) bytes

 (C:\WINDOWS\assembly\GAC_MSIL\Microsoft.SqlServer.ConnectionInfo\9.0.242.0__89845dcd8080cc91\Microsoft.SqlServer.ConnectionInfo.dll)

Fields:

      MT Field Offset Type VT Attr Value Name

793044cc 4000036 40 System.Boolean 1 instance 1 m_BlockUpdates

79330a00 4000037 4 System.String 0 instance 01594eac m_ServerInstance

79330a00 4000038 8 System.String 0 instance 011d1198 m_Login

7995d420 4000039 c ...rity.SecureString 0 instance 00000000 m_Password

793044cc 400003a 41 System.Boolean 1 instance 1 m_LoginSecure

79330a00 400003b 10 System.String 0 instance 011d1198 m_ConnectAsUserName

79330a00 400003c 14 System.String 0 instance 011d1198 m_ConnectAsUserPassword

793044cc 400003d 42 System.Boolean 1 instance 0 m_ConnectAsUser

793044cc 400003e 43 System.Boolean 1 instance 1 m_NonPooledConnection

79332c4c 400003f 28 System.Int32 1 instance 0 m_PooledConnectionLifetime

79332c4c 4000040 2c System.Int32 1 instance 0 m_MinPoolSize

79332c4c 4000041 30 System.Int32 1 instance 100 m_MaxPoolSize

79332c4c 4000042 34 System.Int32 1 instance 15 m_ConnectTimeout

2e2bc5b4 4000043 38 System.Int32 1 instance 8 m_NetworkProtocol

79330a00 4000044 18 System.String 0 instance 01594e4c m_ApplicationName

79330a00 4000045 1c System.String 0 instance 011d1198 m_WorkstationId

79330a00 4000046 20 System.String 0 instance 011d1198 m_DatabaseName

79332c4c 4000047 3c System.Int32 1 instance 4096 m_PacketSize

7995d420 4000048 24 ...rity.SecureString 0 instance 00000000 m_ConnectionString

793044cc 4000049 44 System.Boolean 1 instance 0 m_MultipleActiveResultSets

793044cc 400004a 45 System.Boolean 1 instance 0 shouldEncryptConnection

6523d7a0 400004b 48 ...ent.SqlConnection 0 instance 01594f10 m_SqlConnectionObject

793044cc 400004c 46 System.Boolean 1 instance 1 m_InUse

79332c4c 400004d 68 System.Int32 1 instance 0 m_LoginFailedClients

2e2bc50c 400004e 4c ...ssageEventHandler 0 instance 00000000 m_RemoteLoginFailedHandler

656629a8 400004f 50 ...ssageEventHandler 0 instance 00000000 m_SqlInfoMessageHandler

2e2bd89c 4000050 54 ...ommon.CapturedSql 0 instance 01594ee0 m_CapuredSQL

2e2bc8d4 4000051 6c System.Int32 1 instance 1 m_AutoDisconnectMode

793044cc 4000052 47 System.Boolean 1 instance 0 bIsUserConnected

2e2be0b0 4000053 58 ...mon.ServerVersion 0 instance 015c172c m_serverVersion

79332c4c 4000054 70 System.Int32 1 instance 10 lockTimeout

2e2bc50c 4000055 5c ...ssageEventHandler 0 instance 00000000 ServerMessageInternal

2e2bc480 4000056 60 ...ementEventHandler 0 instance 00000000 StatementExecuted

2e2bc50c 4000057 64 ...ssageEventHandler 0 instance 00000000 RemoteLoginFailedInternal

79332c4c 400005b 80 System.Int32 1 instance 0 m_StatementTimeout

79330a00 400005c 74 System.String 0 instance 01428dcc m_BatchSeparator

79332c4c 400005d 84 System.Int32 1 instance 0 m_TransactionDepth

2e2bc6f4 400005e 88 System.Int32 1 instance 1 m_ExecutionMode

6523db4c 400005f 78 ...Client.SqlCommand 0 instance 01594f48 m_SqlCommand

79330a00 4000060 7c System.String 0 instance 015c1a70 m_TrueName

*dump the SqlCommand object

0:018> !do 01594f48

Name: System.Data.SqlClient.SqlCommand

MethodTable: 6523db4c

EEClass: 6515c250

Size: 132(0x84) 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

7933061c 400018a 4 System.Object 0 instance 00000000 __identity

7a5d2a58 40008c3 8 ...ponentModel.ISite 0 instance 00000000 site

7a5ecd2c 40008c4 c ....EventHandlerList 0 instance 00000000 events

7933061c 40008c2 108 System.Object 0 static 01201278 EventDisposed

79332c4c 40016e3 58 System.Int32 1 instance 58 ObjectID

79330a00 40016e4 10 System.String 0 instance 014e3850 _commandText

6523e698 40016e5 5c System.Int32 1 instance 0 _commandType

79332c4c 40016e6 60 System.Int32 1 instance 0 _commandTimeout

6565989c 40016e7 64 System.Int32 1 instance 3 _updatedRowSource

793044cc 40016e8 78 System.Boolean 1 instance 0 _designTimeInvisible

6567ecdc 40016e9 14 ...ent.SqlDependency 0 instance 00000000 _sqlDep

793044cc 40016ea 79 System.Boolean 1 instance 0 _inPrepare

79332c4c 40016eb 68 System.Int32 1 instance -1 _prepareHandle

793044cc 40016ec 7a System.Boolean 1 instance 0 _hiddenPrepare

6523e8b4 40016ed 18 ...rameterCollection 0 instance 00000000 _parameters

6523d7a0 40016ee 1c ...ent.SqlConnection 0 instance 01594f10 _activeConnection

793044cc 40016ef 7b System.Boolean 1 instance 0 _dirty

656616a4 40016f0 6c System.Int32 1 instance 0 _execType

793041d0 40016f1 20 System.Object[] 0 instance 00000000 _rpcArrayOf1

6524233c 40016f2 24 ...t._SqlMetaDataSet 0 instance 015f9100 _cachedMetaData

65241e94 40016f3 28 ...+CachedAsyncState 0 instance 015c19fc _cachedAsyncState

79332c4c 40016f4 70 System.Int32 1 instance -1 _rowsAffected

6567d4b8 40016f5 2c ...tificationRequest 0 instance 00000000 _notification

793044cc 40016f6 7c System.Boolean 1 instance 1 _notificationAutoEnlist

6567da8c 40016f7 30 ...nt.SqlTransaction 0 instance 00000000 _transaction

65659328 40016f8 34 ...letedEventHandler 0 instance 00000000 _statementCompletedEventHandler

65241814 40016f9 38 ...ParserStateObject 0 instance 00000000 _stateObj

793044cc 40016fa 7d System.Boolean 1 instance 0 _pendingCancel

793044cc 40016fb 7e System.Boolean 1 instance 0 _batchRPCMode

00000000 40016fc 3c 0 instance 00000000 _RPCList

793041d0 40016fd 40 System.Object[] 0 instance 00000000 _SqlRPCBatchArray

00000000 40016fe 44 0 instance 00000000 _parameterCollectionList

79332c4c 40016ff 74 System.Int32 1 instance 0 _currentlyExecutingBatch

656732b0 4001700 48 ...miRequestExecutor 0 instance 00000000 _smiRequest

65672df8 4001701 4c ...Server.SmiContext 0 instance 00000000 _smiRequestContext

6567e144 4001702 50 ...+CommandEventSink 0 instance 00000000 _smiEventSink

65672f4c 4001703 54 ...DeferedProcessing 0 instance 00000000 _outParamEventSink

79332c4c 40016e2 878 System.Int32 1 static 59 _objectTypeCount

793041d0 4001704 78c System.Object[] 0 static 01427968 PreKatmaiProcParamsNames

793041d0 4001705 790 System.Object[] 0 static 014279b4 KatmaiProcParamsNames

* dump the command text

0:018> !do 014e3850

Name: System.String

MethodTable: 79330a00

EEClass: 790ed64c

Size: 68(0x44) bytes

 (C:\WINDOWS\assembly\GAC_32\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll)

String: exec msdb.dbo.sp_help_job

Fields:

   MT Field Offset Type VT Attr Value Name

79332c4c 4000096 4 System.Int32 1 instance 26 m_arrayLength

79332c4c 4000097 8 System.Int32 1 instance 25 m_stringLength

793316e0 4000098 c System.Char 1 instance 65 m_firstChar

79330a00 4000099 10 System.String 0 shared static Empty

    >> Domain:Value 001831e0:011d1198 <<

79331630 400009a 14 System.Char[] 0 shared static WhitespaceChars

    >> Domain:Value 001831e0:011d17d4 <<

* and we have now managed to get the actual TSQL batch executed by SSMS which caused the exception to happen

* this would be enough information to then leave the debugging and go and investigate this from another direction.

* this is effectively what we did in post of the series, by tracing the command through SQL Profiler

 

So we've seen that we've managed to get the code which is executing, and we've also noted that there is a System.DBNull on the stack next to the NextRunDate object. The point here really though is that because we're dealing with the managed code within SSMS alot more is exposed to us using a memory dump. In this case you could continue the debugging to look at the actual data table which is returned by the stored procedure, and then read through it see which row of the data table contains the Null, which then leads you right back to the source data corruption.

The thing that should be really occurring to you now though is that you can get all others sorts of information out , from this simple example, or from any dump which you might trigger of SSMS, if you ever get unexpected behavior.

For example, imagine the problem you had captured a dump for was more complex involving connections to multiple servers, you can review some of the other structures in the Connection object.

* dump the connection object again to remind us of its contents

0:018> !do 01594dbc

Name: Microsoft.SqlServer.Management.Common.ServerConnection

MethodTable: 2e2bda28

EEClass: 2e283d48

Size: 144(0x90) bytes

(C:\WINDOWS\assembly\GAC_MSIL\Microsoft.SqlServer.ConnectionInfo\9.0.242.0__89845dcd8080cc91\Microsoft.SqlServer.ConnectionInfo.dll)

Fields:

MT Field Offset Type VT Attr Value Name

793044cc 4000036 40 System.Boolean 1 instance 1 m_BlockUpdates

79330a00 4000037 4 System.String 0 instance 01594eac m_ServerInstance

79330a00 4000038 8 System.String 0 instance 011d1198 m_Login

7995d420 4000039 c ...rity.SecureString 0 instance 00000000 m_Password

793044cc 400003a 41 System.Boolean 1 instance 1 m_LoginSecure

79330a00 400003b 10 System.String 0 instance 011d1198 m_ConnectAsUserName

79330a00 400003c 14 System.String 0 instance 011d1198 m_ConnectAsUserPassword

793044cc 400003d 42 System.Boolean 1 instance 0 m_ConnectAsUser

793044cc 400003e 43 System.Boolean 1 instance 1 m_NonPooledConnection

79332c4c 400003f 28 System.Int32 1 instance 0 m_PooledConnectionLifetime

79332c4c 4000040 2c System.Int32 1 instance 0 m_MinPoolSize

79332c4c 4000041 30 System.Int32 1 instance 100 m_MaxPoolSize

79332c4c 4000042 34 System.Int32 1 instance 15 m_ConnectTimeout

2e2bc5b4 4000043 38 System.Int32 1 instance 8 m_NetworkProtocol

79330a00 4000044 18 System.String 0 instance 01594e4c m_ApplicationName

79330a00 4000045 1c System.String 0 instance 011d1198 m_WorkstationId

79330a00 4000046 20 System.String 0 instance 011d1198 m_DatabaseName

79332c4c 4000047 3c System.Int32 1 instance 4096 m_PacketSize

7995d420 4000048 24 ...rity.SecureString 0 instance 00000000 m_ConnectionString

793044cc 4000049 44 System.Boolean 1 instance 0 m_MultipleActiveResultSets

793044cc 400004a 45 System.Boolean 1 instance 0 shouldEncryptConnection

6523d7a0 400004b 48 ...ent.SqlConnection 0 instance 01594f10 m_SqlConnectionObject

793044cc 400004c 46 System.Boolean 1 instance 1 m_InUse

79332c4c 400004d 68 System.Int32 1 instance 0 m_LoginFailedClients

2e2bc50c 400004e 4c ...ssageEventHandler 0 instance 00000000 m_RemoteLoginFailedHandler

656629a8 400004f 50 ...ssageEventHandler 0 instance 00000000 m_SqlInfoMessageHandler

2e2bd89c 4000050 54 ...ommon.CapturedSql 0 instance 01594ee0 m_CapuredSQL

2e2bc8d4 4000051 6c System.Int32 1 instance 1 m_AutoDisconnectMode

793044cc 4000052 47 System.Boolean 1 instance 0 bIsUserConnected

2e2be0b0 4000053 58 ...mon.ServerVersion 0 instance 015c172c m_serverVersion

79332c4c 4000054 70 System.Int32 1 instance 10 lockTimeout

2e2bc50c 4000055 5c ...ssageEventHandler 0 instance 00000000 ServerMessageInternal

2e2bc480 4000056 60 ...ementEventHandler 0 instance 00000000 StatementExecuted

2e2bc50c 4000057 64 ...ssageEventHandler 0 instance 00000000 RemoteLoginFailedInternal

79332c4c 400005b 80 System.Int32 1 instance 0 m_StatementTimeout

79330a00 400005c 74 System.String 0 instance 01428dcc m_BatchSeparator

79332c4c 400005d 84 System.Int32 1 instance 0 m_TransactionDepth

2e2bc6f4 400005e 88 System.Int32 1 instance 1 m_ExecutionMode

6523db4c 400005f 78 ...Client.SqlCommand 0 instance 01594f48 m_SqlCommand

79330a00 4000060 7c System.String 0 instance 015c1a70 m_TrueName

* let’s assume we wanted to check and confirm what server we were actually connecting to

* and what version it was running

0:018> * dump the m_serverVersion object

0:018> !do 015c172c

Name: Microsoft.SqlServer.Management.Common.ServerVersion

MethodTable: 2e2be0b0

EEClass: 2e28425c

Size: 20(0x14) bytes

(C:\WINDOWS\assembly\GAC_MSIL\Microsoft.SqlServer.ConnectionInfo\9.0.242.0__89845dcd8080cc91\Microsoft.SqlServer.ConnectionInfo.dll)

Fields:

MT Field Offset Type VT Attr Value Name

79332c4c 400008c 4 System.Int32 1 instance 9 m_nMajor

79332c4c 400008d 8 System.Int32 1 instance 0 m_nMinor

79332c4c 400008e c System.Int32 1 instance 4262 m_nBuildNumber

* now dump the m_ServerInstance object

0:018> !do 01594eac

Name: System.String

MethodTable: 79330a00

EEClass: 790ed64c

Size: 50(0x32) bytes

(C:\WINDOWS\assembly\GAC_32\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll)

String: grahamk20\gk2005

Fields:

MT Field Offset Type VT Attr Value Name

79332c4c 4000096 4 System.Int32 1 instance 17 m_arrayLength

79332c4c 4000097 8 System.Int32 1 instance 16 m_stringLength

793316e0 4000098 c System.Char 1 instance 67 m_firstChar

79330a00 4000099 10 System.String 0 shared static Empty

>> Domain:Value 001831e0:011d1198 <<

79331630 400009a 14 System.Char[] 0 shared static WhitespaceChars

>> Domain:Value 001831e0:011d17d4 <<

* and you can see the name of the server I ran this command against

and of course you can follow this theory on and on depending on the actual problem you are troubleshooting. I hope this provides some insights into some of things you can do when looking at SSMS problems. It’s not something I deal with that often as mostly I focus on the databas engine, but sometimes its interesting to do some managed debugging as opposed to native, and of course its always easier to demonstrate something when you can see real values and references with public symbols alone.