When I am debugging any WCF runtime bug, I classify it in two categories. One that needs IDE (simple logic bugs) and others that need WinDbg. Every one is familiar with the IDE debugging and will leave that topic for another day. Today I wanted to talk a little bit about how I debug WCF bugs that require Windbg. Usually bugs that involve dumps are varied but if I had to pick the common ones then it would the following ones.
Note: Concrete classes are in bold and field names of classes are in italics.
Since I dont have too much information on what the contract is, and what modes (ConcurrencyMode/InstanceContextMode) the ServiceHost is configured, thats the first thing I find out. I usually look for ServiceHost objects and then dump the object.
0:006> !do 01273750 Name: System.ServiceModel.ServiceHostMethodTable: 50e4279cEEClass: 50e4271cSize: 136(0x88) bytes (C:\WINDOWS\assembly\GAC_MSIL\System.ServiceModel\3.0.0.0__b77a5c561934e089\System.ServiceModel.dll)Fields: MT Field Offset Type VT Attr Value Name79104f64 4000915 28 System.Boolean 0 instance 0 aborted79104f64 4000916 29 System.Boolean 0 instance 0 closeCalled50e51310 4000917 4 ...ct+ExceptionQueue 0 instance 00000000 exceptionQueue790f9c18 4000918 8 System.Object 0 instance 0127391c mutex79104f64 4000919 2a System.Boolean 0 instance 0 onClosingCalled79104f64 400091a 2b System.Boolean 0 instance 0 onClosedCalled79104f64 400091b 2c System.Boolean 0 instance 1 onOpeningCalled79104f64 400091c 2d System.Boolean 0 instance 1 onOpenedCalled79104f64 400091d 2e System.Boolean 0 instance 0 raisedClosed79104f64 400091e 2f System.Boolean 0 instance 0 raisedClosing79104f64 400091f 30 System.Boolean 0 instance 0 raisedFaulted79104f64 4000920 31 System.Boolean 0 instance 0 traceOpenAndClose790f9c18 4000921 c System.Object 0 instance 01273750 eventSender50e385f0 4000922 24 System.Int32 0 instance 2 state7910d61c 4000923 10 System.EventHandler 0 instance 00000000 Closed7910d61c 4000924 14 System.EventHandler 0 instance 00000000 Closing7910d61c 4000925 18 System.EventHandler 0 instance 0128fae0 Faulted7910d61c 4000926 1c System.EventHandler 0 instance 00000000 Opened7910d61c 4000927 20 System.EventHandler 0 instance 00000000 Opening79104f64 4002bde 32 System.Boolean 0 instance 1 initializeDescriptionHasFinished50dfecb0 4002bdf 34 ...meKeyedCollection 0 instance 01273928 baseAddresses50e2068c 4002be0 38 ...patcherCollection 0 instance 012739b8 channelDispatchers7910ca9c 4002be1 64 System.TimeSpan 1 instance 012737b4 closeTimeout50df0118 4002be2 3c ...erviceDescription 0 instance 0128fc14 description00000000 4002be3 40 0 instance 012739f4 extensions00000000 4002be4 44 0 instance 00000000 externalBaseAddresses00000000 4002be5 48 0 instance 01293234 implementedContracts50dfe788 4002be6 4c ...nceContextManager 0 instance 01273a30 instances7910ca9c 4002be7 6c System.TimeSpan 1 instance 012737bc openTimeout50de4e78 4002be8 50 ...rformanceCounters 0 instance 00000000 servicePerformanceCounters50dfe9f4 4002be9 54 ...r.ServiceThrottle 0 instance 01273a58 serviceThrottle50e1ed28 4002bea 58 ...erviceCredentials 0 instance 00000000 readOnlyCredentials50e0b9c0 4002beb 5c ...orizationBehavior 0 instance 012acc84 readOnlyAuthorization00000000 4002bec 60 0 instance 00000000 UnknownMessageReceived7a746d44 4002bdd 74c System.Uri 0 static 01273880 EmptyUri790f9c18 4003075 74 System.Object 0 instance 01271bf4 singletonInstance79101058 4003076 78 System.Type 0 instance 0128fb00 serviceType50e4f74c 4003077 7c ...ontractCollection 0 instance 01290d20 reflectedContracts7910c914 4003078 80 System.IDisposable 0 instance 00000000 disposableInstance
In this case you can see that the singletonInstance object is not null which means the InstanceContextMode is Single. You can also infer that if the disposableInstance object is not null. Other way of finding what the InstanceContextMode was to check for InstanceContextProviders and the name of InstanceContextProviders will provide you information on what kind of mode was used (0 = PerSession, 1=PerCall and 2=Single). The serviceType field will tell you the type of contract the host is hosting and with that information you can dig for the actual contract implementation class.
0:006> !dumpheap -type InstanceContextProvider Address MT Size0129f780 50dff25c 20 total 1 objectsStatistics: MT Count TotalSize Class Name50dff25c 1 20 System.ServiceModel.Dispatcher.SingletonInstanceContextProvider
When you dump details of any IInstanceContextProvider, you can see that it contains the DispatchRuntime object associated with that provider. Dumping the DispatchRuntime gives you lot of information. For instance the DispatchRuntime object has a field called concurrencyMode that tells me what the ConcurrencyMode of the contract was (0-Single, 1-Multiple and 2-Reentrant).
0:006> !do 0129f780 Name: System.ServiceModel.Dispatcher.SingletonInstanceContextProviderMethodTable: 50dff25cEEClass: 50dff1e4Size: 20(0x14) bytes (C:\WINDOWS\assembly\GAC_MSIL\System.ServiceModel\3.0.0.0__b77a5c561934e089\System.ServiceModel.dll)Fields: MT Field Offset Type VT Attr Value Name50e30180 400328b 4 ...r.DispatchRuntime 0 instance 0129ed50 dispatchRuntime50e183ac 4003469 8 ...l.InstanceContext 0 instance 0129f7a0 singleton790f9c18 400346a c System.Object 0 instance 0129f794 thisLock0:006> !do 0129ed50 Name: System.ServiceModel.Dispatcher.DispatchRuntimeMethodTable: 50e30180EEClass: 50e30110Size: 112(0x70) bytes (C:\WINDOWS\assembly\GAC_MSIL\System.ServiceModel\3.0.0.0__b77a5c561934e089\System.ServiceModel.dll)Fields: MT Field Offset Type VT Attr Value Name50e2bf6c 4002fd1 4 ...horizationManager 0 instance 00000000 serviceAuthorizationManager00000000 4002fd2 8 0 instance 00000000 externalAuthorizationPolicies50ddbab8 4002fd3 50 System.Int32 0 instance 0 securityAuditLogLocation50e3ca64 4002fd4 54 System.Int32 0 instance 0 concurrencyMode79104f64 4002fd5 64 System.Boolean 0 instance 1 suppressAuditFailure50e0a434 4002fd6 58 System.Int32 0 instance 0 serviceAuthorizationAuditLevel50e0a434 4002fd7 5c System.Int32 0 instance 0 messageAuthenticationAuditLevel79104f64 4002fd8 65 System.Boolean 0 instance 1 automaticInputSessionShutdown50e1eae0 4002fd9 c ...ChannelDispatcher 0 instance 00000000 channelDispatcher00000000 4002fda 10 0 instance 0129ee1c inputSessionShutdownHandlers50e38924 4002fdb 14 ...ndpointDispatcher 0 instance 0129ebd4 endpointDispatcher50dfd8e8 4002fdc 18 ...IInstanceProvider 0 instance 00000000 instanceProvider50e5c730 4002fdd 1c ...ceContextProvider 0 instance 0129f780 instanceContextProvider50e183ac 4002fde 20 ...l.InstanceContext 0 instance 0129f7a0 singleton79104f64 4002fdf 66 System.Boolean 0 instance 1 ignoreTransactionMessageProperty00000000 4002fe0 24 0 instance 0129ee58 messageInspectors50e4b3ec 4002fe1 28 ...erationCollection 0 instance 0129edd0 operations50e628c8 4002fe2 2c ...OperationSelector 0 instance 00000000 operationSelector50dc9cbc 4002fe3 30 ...her.ClientRuntime 0 instance 012f0fc0 proxyRuntime50dd8040 4002fe4 34 ...leDispatchRuntime 0 instance 012a881c runtime00000000 4002fe5 38 0 instance 0129ee94 instanceContextInitializers79104f64 4002fe6 67 System.Boolean 0 instance 0 isExternalPoliciesSet79104f64 4002fe7 68 System.Boolean 0 instance 0 isAuthorizationManagerSet7910db30 4002fe8 3c ...ronizationContext 0 instance 00000000 synchronizationContext50e421e0 4002fe9 60 System.Int32 0 instance 1 principalPermissionMode790f7ab4 4002fea 40 System.Void 0 instance 00000000 roleProvider79101058 4002feb 44 System.Type 0 instance 0128fb00 type50e07e68 4002fec 48 ...DispatchOperation 0 instance 0129eed0 unhandled79104f64 4002fed 69 System.Boolean 0 instance 0 transactionAutoCompleteOnSessionClose79104f64 4002fee 6a System.Boolean 0 instance 0 impersonateCallerForAllOperations79104f64 4002fef 6b System.Boolean 0 instance 1 releaseServiceInstanceOnTransactionComplete50dc9e08 4002ff0 4c ...haredRuntimeState 0 instance 0129edc0 shared
Then I generally check the throttle limit sets on the serviceHost by dumping the serviceThrottle object. This also tells me how many throttles (Call/InstanceContext/Session) has been handed out.
0:006> !do 01273a58 Name: System.ServiceModel.Dispatcher.ServiceThrottleMethodTable: 50dfe9f4EEClass: 50dfe984Size: 36(0x24) bytes (C:\WINDOWS\assembly\GAC_MSIL\System.ServiceModel\3.0.0.0__b77a5c561934e089\System.ServiceModel.dll)Fields: MT Field Offset Type VT Attr Value Name50e37290 400349b 4 ...cher.FlowThrottle 0 instance 01273b54 calls ==>We will dump this as a sample50e37290 400349c 8 ...cher.FlowThrottle 0 instance 01273c10 sessions50e03a04 400349d c ...her.QuotaThrottle 0 instance 00000000 dynamic50e37290 400349e 10 ...cher.FlowThrottle 0 instance 00000000 instanceContexts50e5e99c 400349f 14 ...l.ServiceHostBase 0 instance 01273750 host79104f64 40034a0 1c System.Boolean 0 instance 1 isActive790f9c18 40034a1 18 System.Object 0 instance 01273af0 thisLock0:006> !do 01273b54 Name: System.ServiceModel.Dispatcher.FlowThrottleMethodTable: 50e37290EEClass: 50e37220Size: 36(0x24) bytes (C:\WINDOWS\assembly\GAC_MSIL\System.ServiceModel\3.0.0.0__b77a5c561934e089\System.ServiceModel.dll)Fields: MT Field Offset Type VT Attr Value Name790fed1c 400327b 18 System.Int32 0 instance 16 capacity790fed1c 400327c 1c System.Int32 0 instance 0 count790f9c18 400327d 4 System.Object 0 instance 01273b78 mutex79113c8c 400327e 8 ...ding.WaitCallback 0 instance 01273b34 release00000000 400327f c 0 instance 01273b84 waiters790fa3e0 4003280 10 System.String 0 instance 01273ab8 propertyName790fa3e0 4003281 14 System.String 0 instance 01273afc configName
For example you can see that in this case the Call throttle is set to 16 (default) and the count is 0 which means no throttles have been acquired. In cases when the count value is equal to capacity then you can check the waiters object to see which client is waiting for a call throttle. This applies to any FlowThrottle class.
If I wanted to see how many InstanceContext's have been issued by the runtime, then I check the instances property on ServiceHost which points the collection manager. You can dump the items array to see each individual InstanceContext.
With the handle to InstanceContext, you can then check for the list of sessionful open channels that are associated with the InstanceContext at that time.
0:006> !do 0129f7a0 Name: System.ServiceModel.InstanceContextMethodTable: 50e183acEEClass: 50e18334Size: 112(0x70) bytes (C:\WINDOWS\assembly\GAC_MSIL\System.ServiceModel\3.0.0.0__b77a5c561934e089\System.ServiceModel.dll)Fields: MT Field Offset Type VT Attr Value Name79104f64 4000915 28 System.Boolean 0 instance 0 aborted79104f64 4000916 29 System.Boolean 0 instance 0 closeCalled50e51310 4000917 4 ...ct+ExceptionQueue 0 instance 00000000 exceptionQueue790f9c18 4000918 8 System.Object 0 instance 0129f81c mutex79104f64 4000919 2a System.Boolean 0 instance 0 onClosingCalled79104f64 400091a 2b System.Boolean 0 instance 0 onClosedCalled79104f64 400091b 2c System.Boolean 0 instance 1 onOpeningCalled79104f64 400091c 2d System.Boolean 0 instance 1 onOpenedCalled79104f64 400091d 2e System.Boolean 0 instance 0 raisedClosed79104f64 400091e 2f System.Boolean 0 instance 0 raisedClosing79104f64 400091f 30 System.Boolean 0 instance 0 raisedFaulted79104f64 4000920 31 System.Boolean 0 instance 0 traceOpenAndClose790f9c18 4000921 c System.Object 0 instance 0129f7a0 eventSender50e385f0 4000922 24 System.Int32 0 instance 2 state7910d61c 4000923 10 System.EventHandler 0 instance 00000000 Closed7910d61c 4000924 14 System.EventHandler 0 instance 00000000 Closing7910d61c 4000925 18 System.EventHandler 0 instance 00000000 Faulted7910d61c 4000926 1c System.EventHandler 0 instance 00000000 Opened7910d61c 4000927 20 System.EventHandler 0 instance 00000000 Opening79104f64 400346d 32 System.Boolean 0 instance 0 autoClose50e20c74 400346e 34 ....InstanceBehavior 0 instance 012a88c8 behavior50e5d498 400346f 38 ...iceChannelManager 0 instance 0129f828 channels50e1b4f8 4003470 3c ...tanceContextFacet 0 instance 012f1308 concurrency00000000 4003471 40 0 instance 00000000 extensions50e5e99c 4003472 44 ...l.ServiceHostBase 0 instance 01273750 host50e03a04 4003473 48 ...her.QuotaThrottle 0 instance 00000000 quotaThrottle50dfe9f4 4003474 4c ...r.ServiceThrottle 0 instance 00000000 serviceThrottle790fed1c 4003475 64 System.Int32 0 instance 1 instanceContextManagerIndex790f9c18 4003476 50 System.Object 0 instance 0129f810 serviceInstanceLock7910db30 4003477 54 ...ronizationContext 0 instance 00000000 synchronizationContext50e0b340 4003478 58 ...tanceContextFacet 0 instance 00000000 transaction790f9c18 4003479 5c System.Object 0 instance 01271bf4 userObject79104f64 400347a 33 System.Boolean 0 instance 1 wellKnown00000000 400347b 60 0 instance 00000000 wmiChannels79104f64 400347c 68 System.Boolean 0 instance 0 isUserCreated50e6393c 400346b 8c4 ...textEmptyCallback 0 static 012f13bc NotifyEmptyCallback50dde148 400346c 8c8 ...ntextIdleCallback 0 static 012f13dc NotifyIdleCallback0:006> !do 0129f828 Name: System.ServiceModel.ServiceChannelManagerMethodTable: 50e5d498EEClass: 50e5d420Size: 64(0x40) bytes (C:\WINDOWS\assembly\GAC_MSIL\System.ServiceModel\3.0.0.0__b77a5c561934e089\System.ServiceModel.dll)Fields: MT Field Offset Type VT Attr Value Name79104f64 40009df 18 System.Boolean 0 instance 0 aborted790fed1c 40009e0 c System.Int32 0 instance 0 busyCount50e08e90 40009e1 4 ...mmunicationWaiter 0 instance 00000000 busyWaiter790fed1c 40009e2 10 System.Int32 0 instance 0 busyWaiterCount790f9c18 40009e3 8 System.Object 0 instance 0129f81c mutex50e26624 40009e4 14 System.Int32 0 instance 0 state790fed1c 400347f 34 System.Int32 0 instance 0 activityCount50e08e90 4003480 1c ...mmunicationWaiter 0 instance 00000000 activityWaiter790fed1c 4003481 38 System.Int32 0 instance 0 activityWaiterCount50e6393c 4003482 20 ...textEmptyCallback 0 instance 00000000 emptyCallback50dc8564 4003483 24 ...Channels.IChannel 0 instance 00000000 firstIncomingChannel50e60abc 4003484 28 ...ChannelCollection 0 instance 00000000 incomingChannels50e60abc 4003485 2c ...ChannelCollection 0 instance 012f3ca8 outgoingChannels50e183ac 4003486 30 ...l.InstanceContext 0 instance 0129f7a0 instanceContext
The channels field in InstanceContext points to the Sessionful channels collection which when dumped will give you list of all channels when the incomingChannels field is accessed. If you determine the ConcurrencyMode to be Reentrant then its possible that some requests can be queued in the InstanceContext when its actively servicing a message. This information can be found by dumping the concurrency field in InstanceContext.
0:006> !do 012f1308 Name: System.ServiceModel.Dispatcher.ConcurrencyInstanceContextFacetMethodTable: 50e1b4f8EEClass: 50e1b488Size: 20(0x14) bytes (C:\WINDOWS\assembly\GAC_MSIL\System.ServiceModel\3.0.0.0__b77a5c561934e089\System.ServiceModel.dll)Fields: MT Field Offset Type VT Attr Value Name79104f64 4002fc0 c System.Boolean 0 instance 0 Locked00000000 4002fc1 4 0 instance 00000000 calloutMessageQueue00000000 4002fc2 8 0 instance 00000000 newMessageQueue
calloutMessageQueue is the queue which holds the message which when processing made an outgoing call. The newMessageQueue denotes the new messages coming in that are waiting for the InstanceContext to finish processing the message.
Coming back to the channels collection in InstanceContext, you can pick any one channel from the list and when you dump it, it will be of type ServiceChannel. This is the internal representation of all WCF channels. Like the DispatchRuntime, the ServiceChannel also provides lot of information.
0:006> !do 012f0ebcName: System.ServiceModel.Channels.ServiceChannelMethodTable: 50dcd674EEClass: 50dcd5fcSize: 152(0x98) bytes (C:\WINDOWS\assembly\GAC_MSIL\System.ServiceModel\3.0.0.0__b77a5c561934e089\System.ServiceModel.dll)Fields: MT Field Offset Type VT Attr Value Name79104f64 4000915 28 System.Boolean 0 instance 0 aborted79104f64 4000916 29 System.Boolean 0 instance 0 closeCalled50e51310 4000917 4 ...ct+ExceptionQueue 0 instance 00000000 exceptionQueue790f9c18 4000918 8 System.Object 0 instance 012f0f54 mutex79104f64 4000919 2a System.Boolean 0 instance 0 onClosingCalled79104f64 400091a 2b System.Boolean 0 instance 0 onClosedCalled79104f64 400091b 2c System.Boolean 0 instance 1 onOpeningCalled79104f64 400091c 2d System.Boolean 0 instance 1 onOpenedCalled79104f64 400091d 2e System.Boolean 0 instance 0 raisedClosed79104f64 400091e 2f System.Boolean 0 instance 0 raisedClosing79104f64 400091f 30 System.Boolean 0 instance 0 raisedFaulted79104f64 4000920 31 System.Boolean 0 instance 0 traceOpenAndClose790f9c18 4000921 c System.Object 0 instance 012f0ebc eventSender50e385f0 4000922 24 System.Int32 0 instance 2 state7910d61c 4000923 10 System.EventHandler 0 instance 012f11fc Closed7910d61c 4000924 14 System.EventHandler 0 instance 00000000 Closing7910d61c 4000925 18 System.EventHandler 0 instance 00000000 Faulted7910d61c 4000926 1c System.EventHandler 0 instance 00000000 Opened7910d61c 4000927 20 System.EventHandler 0 instance 00000000 Opening790fed1c 400310b 7c System.Int32 0 instance 1 activityCount ==>Denotes how many activity is being actively processed. 0 indicates the Channel is ready to be closed.79104f64 400310c 32 System.Boolean 0 instance 1 allowInitializationUI79104f64 400310d 33 System.Boolean 0 instance 0 allowOutputBatching79104f64 400310e 80 System.Boolean 0 instance 1 autoClose ==>Will autoclose when the other side initiates a Close.50dd04c8 400310f 34 ...l+CallOnceManager 0 instance 00000000 autoDisplayUIManager50dd04c8 4003110 38 ...l+CallOnceManager 0 instance 00000000 autoOpenManager50dcd9f0 4003111 3c ...er.IChannelBinder 0 instance 012c8cd4 binder50e1eae0 4003112 40 ...ChannelDispatcher 0 instance 0129e898 channelDispatcher50dc9cbc 4003113 44 ...her.ClientRuntime 0 instance 012f0fc0 clientRuntime79104f64 4003114 81 System.Boolean 0 instance 1 closeBinder79104f64 4003115 82 System.Boolean 0 instance 0 closeFactory79104f64 4003116 83 System.Boolean 0 instance 0 didIdleAbort ==>Did the idle timer expire79104f64 4003117 84 System.Boolean 0 instance 0 didInteractiveInitialization79104f64 4003118 85 System.Boolean 0 instance 0 doneReceiving ==>Usually means the Channel is done receiveing replies for all outstanding requests50e38924 4003119 48 ...ndpointDispatcher 0 instance 0129ebd4 endpointDispatcher79104f64 400311a 86 System.Boolean 0 instance 1 explicitlyOpened ==> Was it autoopened or explicitly opened00000000 400311b 4c 0 instance 00000000 extensions50dc8618 400311c 50 ...iceChannelFactory 0 instance 00000000 factory79104f64 400311d 87 System.Boolean 0 instance 1 hasSession50e4331c 400311e 54 ...essionIdleManager 0 instance 012f1168 idleManager50e183ac 400311f 58 ...l.InstanceContext 0 instance 0129f7a0 instanceContext50dfe9f4 4003120 5c ...r.ServiceThrottle 0 instance 00000000 instanceContextServiceThrottle79104f64 4003121 88 System.Boolean 0 instance 0 isPending79104f64 4003122 89 System.Boolean 0 instance 0 isReplyChannel50dbc7d0 4003123 60 ...l.EndpointAddress 0 instance 00000000 localAddress50dc3874 4003124 64 ...ls.MessageVersion 0 instance 0129658c messageVersion79104f64 4003125 8a System.Boolean 0 instance 0 openBinder7910ca9c 4003126 8c System.TimeSpan 1 instance 012f0f48 operationTimeout790f9c18 4003127 68 System.Object 0 instance 00000000 proxy50dfe9f4 4003128 6c ...r.ServiceThrottle 0 instance 01273a58 serviceThrottle790fa3e0 4003129 70 System.String 0 instance 00000000 terminatingOperationName50e183ac 400312a 74 ...l.InstanceContext 0 instance 00000000 wmiInstanceContext79104f64 400312b 8b System.Boolean 0 instance 0 wasChannelAutoClosed00000000 400312c 78 0 instance 00000000 unknownMessageReceived
Digging through the binder field in ServiceChannel will give you the IChannelBinder which will hold a reference to the ChannelHandler object that is responsible for pumping messages from that Channel. If you feel that messages from a particular connected client is not being processed it could be that he ChannelHandler is not pumping messages. I say connected because only channels that have been accepted by the runtime will be having a ChannelHandler object. If there is no session throttles left then clients will timeout in their Open() call itself.
0:006> !do 012c8df0 Name: System.ServiceModel.Dispatcher.ChannelHandlerMethodTable: 50e07bd0EEClass: 50e07b58Size: 104(0x68) bytes (C:\WINDOWS\assembly\GAC_MSIL\System.ServiceModel\3.0.0.0__b77a5c561934e089\System.ServiceModel.dll)Fields: MT Field Offset Type VT Attr Value Name50dec920 40031b6 4c ...ndler+RequestInfo 1 instance 012c8e3c requestInfo50dcd9f0 40031b7 4 ...er.IChannelBinder 0 instance 012c8cd4 binder50dcd674 40031b8 8 ...ls.ServiceChannel 0 instance 012f0ebc channel79104f64 40031b9 3c System.Boolean 0 instance 0 doneReceiving ==>Indicates all messages have been pumped from the Channel50dcddf0 40031ba c ...plexChannelBinder 0 instance 012c8cd4 duplexBinder79104f64 40031bb 3d System.Boolean 0 instance 1 hasRegisterBeenCalled79104f64 40031bc 3e System.Boolean 0 instance 1 hasSession50e5e99c 40031bd 10 ...l.ServiceHostBase 0 instance 01273750 host79104f64 40031be 3f System.Boolean 0 instance 0 incrementedActivityCountInConstructor79104f64 40031bf 40 System.Boolean 0 instance 0 isCallback79104f64 40031c0 41 System.Boolean 0 instance 0 isPumpAcquired79104f64 40031c1 42 System.Boolean 0 instance 0 isChannelTerminated79104f64 40031c2 43 System.Boolean 0 instance 0 isConcurrent ==>0 indicates Single ConcurrencyMode79104f64 40031c3 44 System.Boolean 0 instance 0 isManualAddressing50e139b0 40031c4 14 ...r.ListenerHandler 0 instance 012acb8c listener ==>Listener off which Messages are received50dc3874 40031c5 18 ...ls.MessageVersion 0 instance 0129658c messageVersion50dfe854 40031cc 1c ...rHandlingReceiver 0 instance 012c8e70 receiver79104f64 40031cd 45 System.Boolean 0 instance 0 receiveSynchronously ==>Indicated whether the pump is sync or async79104f64 40031ce 46 System.Boolean 0 instance 0 receiveWithTransaction50e65618 40031cf 20 ...ls.RequestContext 0 instance 00000000 replied50e65618 40031d0 24 ...ls.RequestContext 0 instance 00000000 requestWaitingForThrottle50e4bab4 40031d1 28 ...rappedTransaction 0 instance 00000000 acceptTransaction50dfe9f4 40031d2 2c ...r.ServiceThrottle 0 instance 01273a58 throttle79104f64 40031d3 47 System.Boolean 0 instance 1 wasChannelThrottled50dfe9f4 40031d4 30 ...r.ServiceThrottle 0 instance 00000000 instanceContextThrottle50e60c28 40031d5 34 ...actedBatchContext 0 instance 00000000 sharedTransactedBatchContext00000000 40031d6 38 ...actedBatchContext 0 instance 00000000 transactedBatchContext79104f64 40031d7 48 System.Boolean 0 instance 0 isMainTransactedBatchHandler7910ca9c 40031b5 844 System.TimeSpan 1 static 012c8e80 CloseAfterFaultTimeout79107d2c 40031c6 848 System.AsyncCallback 0 static 012c8ec0 onAsyncReceiveComplete79113c8c 40031c7 84c ...ding.WaitCallback 0 static 012c8ee0 onContinueAsyncReceive79113c8c 40031c8 850 ...ding.WaitCallback 0 static 012c8f00 onStartSyncMessagePump79113c8c 40031c9 854 ...ding.WaitCallback 0 static 012c8f20 onStartAsyncMessagePump79113c8c 40031ca 858 ...ding.WaitCallback 0 static 012c8f40 onStartSingleTransactedBatch79113c8c 40031cb 85c ...ding.WaitCallback 0 static 012c8f60 openAndEnsurePump
Think I should stop at this for today. Some of the information here should be useful for all end user developers (like throttles). Due to our extensive testing, end users should never have to worry about debugging some classes (like ChannelDispatcher) unless they implement their own channel stack and want to know why the ChannelDispatcher is not pumping messages off their channel. Hopefully this will gives you enough information to go and dig around your server dumps and try to figure out where the bottle neck could be (Waiting for throttle/Waiting for reentrance/waiting for new message to be received etc).
Next time I will talk about how to debug the client side ServiceChannel (in case of timeouts) and talk a little bit more about input queues on the server.
Maheshwar Jayaraman