<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Speaking of which... : Debugging School</title><link>http://blogs.msdn.com/johan/archive/tags/Debugging+School/default.aspx</link><description>Tags: Debugging School</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>Make sure you have an Internet connection when using signed assemblies</title><link>http://blogs.msdn.com/johan/archive/2009/11/12/make-sure-you-have-an-internet-connection-when-using-signed-assemblies.aspx</link><pubDate>Thu, 12 Nov 2009 11:08:22 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9921295</guid><dc:creator>JohanS</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/johan/comments/9921295.aspx</comments><wfw:commentRss>http://blogs.msdn.com/johan/commentrss.aspx?PostID=9921295</wfw:commentRss><description>&lt;p&gt;A customer called in the other day and told me that his web application took a long time to start. My initial thought was (off course) that it was a matter of the classic slow-to start web services I’ve written about earlier.&lt;/p&gt;  &lt;p&gt;(&lt;a title="What to do about the slow startup of web services" href="http://blogs.msdn.com/johan/archive/2008/04/02/what-to-do-about-the-slow-startup-of-web-services.aspx"&gt;What to do about the slow startup of web services&lt;/a&gt;)&lt;/p&gt;  &lt;p&gt;As I learned more about his problem I found that this was more than just a simple matter of pre-compilation and keeping your w3wp.exe alive.&lt;/p&gt;  &lt;h1&gt;The Cause&lt;/h1&gt;  &lt;p&gt;The customer was using authenticode signed assemblies in his web application. When that application calls the assembly for the first time it will want to go on-line and check that the certificate is still valid. So, what if this is an internal server with no Internet access? Well, then we have a problem. The process will spend quite some time trying to check the certificate revocation lists. Eventually it will give up, but for my customer this meant that it hung for at least 20 seconds upon startup.&lt;/p&gt;  &lt;h1&gt;The Resolution&lt;/h1&gt;  &lt;p&gt;To resolve this I’d chose one of the following three options:&lt;/p&gt;  &lt;h3&gt;Grant Internet access to the server&lt;/h3&gt;  &lt;p&gt;This is will obviously resolve the problem, but may not always be possible.&lt;/p&gt;  &lt;h3&gt;Review the need for Authenticode signing&lt;/h3&gt;  &lt;p&gt;If you own the assemblies then you might want to consider not using Authenticode signing at all. A Strong Named Assembly might be sufficient. For more information on Strong Named Assemblies and how to create them, please see the following article on MSDN: &lt;a title="How to- Sign an Assembly with a Strong Name" href="http://msdn.microsoft.com/en-us/library/xc31ft41.aspx" target="_blank"&gt;How to: Sign an Assembly with a Strong Name&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;Disable Signature Verification&lt;/h3&gt;  &lt;p&gt;If all else fails you can disable Signature Verification by adding the following to your machine.config or application.exe.config:&lt;/p&gt;  &lt;div class="SampleCode"&gt;&amp;lt;configuration&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;runtime&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;generatepublisherevidence enabled=&amp;quot;false&amp;quot; /&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/runtime&amp;gt;     &lt;br /&gt;&amp;lt;/configuration&amp;gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;h1&gt;Identifying the problem using windbg&lt;/h1&gt;  &lt;p&gt;Okay, so if we suspect that this is the problem, how can we verify this?&lt;/p&gt;  &lt;p&gt;I got a memory dump from my customer, so I’ll use that to demonstrate.&lt;/p&gt;  &lt;p&gt;First of all you want to make sure the dump is taken as the application pool hangs upon the first request. Getting a dump right after the problem has occurred will usually do us no good at all. We need to get the dump as the problem is actually ocurring. Having made sure the dump is fine I open up the dump in windbg and load sos.dll. I then use the !aspxpages command to see the pending requests currently on the server. !aspxpages dumps all the HttpContexts found on the heap so we get a list of all currently executing requests, as well as recently finished ones that haven’t been garbage collected yet.&lt;/p&gt;  &lt;div class="DebugSample"&gt;0:000&amp;gt; .load C:\Windows\Microsoft.NET\Framework\v2.0.50727\sos.dll    &lt;br /&gt;0:000&amp;gt; !aspxpages     &lt;br /&gt;Going to dump the HttpContexts found in the heap.     &lt;br /&gt;Loading the heap objects into our cache.     &lt;br /&gt;HttpContext&amp;#160;&amp;#160;&amp;#160; Timeout&amp;#160; Completed&amp;#160;&amp;#160;&amp;#160;&amp;#160; Running&amp;#160; ThreadId ReturnCode&amp;#160;&amp;#160; Verb RequestPath+QueryString     &lt;br /&gt;0x01b41ad4&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 0&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; no&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 11 Sec&amp;#160;&amp;#160;&amp;#160;&amp;#160; XXX&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 200&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /App/     &lt;br /&gt;0x01b75f48&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 110 Sec&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; no&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 11 Sec&amp;#160;&amp;#160;&amp;#160;&amp;#160; XXX&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 401&amp;#160;&amp;#160; GET /App/Default.aspx     &lt;br /&gt;0x01b7eb40&amp;#160;&amp;#160;&amp;#160; 19200 Sec&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; no&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 11 Sec&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#ff0000"&gt;19&lt;/font&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 200&amp;#160;&amp;#160; GET /App/Default.aspx     &lt;br /&gt;Total 3 HttpContext objects &lt;/div&gt;  &lt;p&gt;So, the request on thread 19 is the one we want. As we can see in the ThreadId column it is the only active request. Let’s jump to that thread and investigate what it is doing.&lt;/p&gt;  &lt;div class="DebugSample"&gt;0:000&amp;gt; ~19s    &lt;br /&gt;eax=01510000 ebx=00000000 ecx=03e2d348 edx=776d9a94 esi=03e2d07c edi=00000000     &lt;br /&gt;eip=776d9a94 esp=03e2d034 ebp=03e2d0a4 iopl=0&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; nv up ei ng nz ac pe cy     &lt;br /&gt;cs=001b&amp;#160; ss=0023&amp;#160; ds=0023&amp;#160; es=0023&amp;#160; fs=003b&amp;#160; gs=0000&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; efl=00000297     &lt;br /&gt;ntdll!KiFastSystemCallRet:     &lt;br /&gt;776d9a94 c3&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ret     &lt;br /&gt;0:019&amp;gt; !clrstack     &lt;br /&gt;OS Thread Id: 0x11cc (19)     &lt;br /&gt;ESP&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; EIP&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;03e2eb8c 776d9a94 [PrestubMethodFrame: 03e2eb8c] App.BasePage.&lt;font color="#ff0000"&gt;Page_Load&lt;/font&gt;(System.Object, System.EventArgs)     &lt;br /&gt;03e2eba0 6aada7ff System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr, System.Object, System.Object, System.EventArgs)     &lt;br /&gt;03e2ebb0 6c392594 System.Web.Util.CalliEventHandlerDelegateProxy.Callback(System.Object, System.EventArgs)     &lt;br /&gt;03e2ebc4 6c38ba84 System.Web.UI.Control.OnLoad(System.EventArgs)     &lt;br /&gt;03e2ebd8 6c38bac3 System.Web.UI.Control.LoadRecursive()     &lt;br /&gt;03e2ebf0 6c387b74 System.Web.UI.Page.ProcessRequestMain(Boolean, Boolean)     &lt;br /&gt;03e2ed48 6c3877a4 System.Web.UI.Page.ProcessRequest(Boolean, Boolean)     &lt;br /&gt;03e2ed80 6c3876d1 System.Web.UI.Page.ProcessRequest()     &lt;br /&gt;03e2edb8 6c387666 System.Web.UI.Page.ProcessRequestWithNoAssert(System.Web.HttpContext)     &lt;br /&gt;03e2edc4 6c387642 System.Web.UI.Page.ProcessRequest(System.Web.HttpContext)     &lt;br /&gt;03e2edd8 012b02a6 ASP.text.ProcessRequest(System.Web.HttpContext)     &lt;br /&gt;03e2ede8 6c38db16 System.Web.HttpApplication+CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()     &lt;br /&gt;03e2ee1c 6c36132c System.Web.HttpApplication.ExecuteStep(IExecutionStep, Boolean ByRef)     &lt;br /&gt;03e2ee5c 6c95531f System.Web.HttpApplication+PipelineStepManager.ResumeSteps(System.Exception)     &lt;br /&gt;03e2ee60 6c94b704 [InlinedCallFrame: 03e2ee60]     &lt;br /&gt;03e2ef00 6c93613d System.Web.HttpRuntime.ProcessRequestNotificationPrivate(System.Web.Hosting.IIS7WorkerRequest, System.Web.HttpContext)     &lt;br /&gt;03e2ef70 6ca0a7a2 System.Web.Hosting.PipelineRuntime.ProcessRequestNotificationHelper(IntPtr, IntPtr, IntPtr, Int32)     &lt;br /&gt;03e2ef74 6ca0a58f [InlinedCallFrame: 03e2ef74]     &lt;br /&gt;03e2f4c8 01092314 [NDirectMethodFrameStandalone: 03e2f4c8] System.Web.Hosting.UnsafeIISMethods.MgdIndicateCompletion(IntPtr, System.Web.RequestNotificationStatus ByRef)     &lt;br /&gt;03e2f4d8 6ca0a839 System.Web.Hosting.PipelineRuntime.ProcessRequestNotificationHelper(IntPtr, IntPtr, IntPtr, Int32)     &lt;br /&gt;03e2f55c 6ca0a58f System.Web.Hosting.PipelineRuntime.ProcessRequestNotification(IntPtr, IntPtr, IntPtr, Int32)     &lt;br /&gt;03e2f65c 01092314 [ContextTransitionFrame: 03e2f65c] &lt;/div&gt;  &lt;p&gt;So we’re in the Page_Load event of the page in question, but apart from that !clrstack doesn’t tell us much. Let’s take a look at the native callstack instead using the kb-command.&lt;/p&gt;  &lt;div class="DebugSample"&gt;0:019&amp;gt; kb20    &lt;br /&gt;ChildEBP RetAddr&amp;#160; Args to Child&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;03e2d030 776d9254 76adc244 000006d8 00000000 ntdll!KiFastSystemCallRet     &lt;br /&gt;03e2d034 76adc244 000006d8 00000000 03e2d07c ntdll!ZwWaitForSingleObject+0xc     &lt;br /&gt;03e2d0a4 74256247 000006d8 00003a98 00000000 kernel32!&lt;font color="#ff0000"&gt;WaitForSingleObjectEx&lt;/font&gt;+0xbe     &lt;br /&gt;03e2d0d8 74251f7c 0141f2e4 00000002 00202005 cryptnet!CryptRetrieveObjectByUrlWithTimeout+0x1a5     &lt;br /&gt;03e2d1c8 742527a1 0141f2e4 00000002 00202005 cryptnet!CryptRetrieveObjectByUrlW+0xcc     &lt;br /&gt;03e2d268 742591be 00000000 0141f2e4 00000002 cryptnet!RetrieveObjectByUrlValidForSubject+0xa0     &lt;br /&gt;03e2d2c8 74252556 00000000 00000000 00000001 cryptnet!RetrieveTimeValidObjectByUrl+0x15c     &lt;br /&gt;03e2d374 74253fc1 00000082 0141f2d8 00000000 cryptnet!CTVOAgent::GetTimeValidObjectByUrl+0x178     &lt;br /&gt;03e2d45c 74253d98 00000003 018aa590 00000002 cryptnet!CTVOAgent::GetTimeValidObject+0x4a8     &lt;br /&gt;03e2d48c 74253428 00000003 018aa590 018c8220 cryptnet!FreshestCrlFromCrlGetTimeValidObject+0x2d     &lt;br /&gt;03e2d4d0 74259283 00000003 018aa590 018c8220 cryptnet!CryptGetTimeValidObject+0x58     &lt;br /&gt;03e2d54c 74253b1c 00000003 018aa590 018aa590 cryptnet!GetTimeValidCrl+0x2cb     &lt;br /&gt;03e2d590 74253992 018aa590 018c8220 03e2d5c8 cryptnet!GetBaseCrl+0x34     &lt;br /&gt;03e2d63c 757f77d5 00000001 00000001 00000001 cryptnet!&lt;font color="#ff0000"&gt;MicrosoftCertDllVerifyRevocation&lt;/font&gt;+0x163     &lt;br /&gt;03e2d6c8 757f7641 00000001 00000001 00000001 crypt32!I_CryptRemainingMilliseconds+0x2aa     &lt;br /&gt;03e2d74c 757f7a26 00000001 00000001 00000001 crypt32!CertVerifyRevocation+0xd4     &lt;br /&gt;03e2d7f8 757f7838 01899590 00000000 00000000 crypt32!CChainPathObject::CalculateRevocationStatus+0x2d0     &lt;br /&gt;03e2d83c 75806c44 01899590 018c3018 01870fc0 crypt32!CChainPathObject::CalculateAdditionalStatus+0x152     &lt;br /&gt;03e2d904 758069a5 01899590 018aa590 01870fc0 crypt32!CCertChainEngine::CreateChainContextFromPathGraph+0x23e     &lt;br /&gt;03e2d93c 7580be14 018aa590 018aff94 01870fc0 crypt32!CCertChainEngine::GetChainContext+0x46     &lt;br /&gt;03e2d974 749172ba 01421338 018aa590 018aff94 crypt32!CertGetCertificateChain+0x72     &lt;br /&gt;03e2d9dc 749170fc 40000001 00000000 03e2da10 wintrust!_WalkChain+0x1ae     &lt;br /&gt;03e2da18 7491363b 00000000 03e2dbdc 03e2db74 wintrust!WintrustCertificateTrust+0xb9     &lt;br /&gt;03e2db30 7491346c 00000000 03e2dbe4 00000000 wintrust!_VerifyTrust+0x253     &lt;br /&gt;03e2db54 64025b1b 00000000 03e2dbe4 03e2db74 wintrust!WinVerifyTrust+0x50     &lt;br /&gt;03e2dbf8 716b7f4d &lt;font color="#ff0000"&gt;014443f8&lt;/font&gt; 00000000 00000003 mscorsec!&lt;font color="#ff0000"&gt;GetPublisher&lt;/font&gt;+0xe4     &lt;br /&gt;03e2dc50 7145ed3b d60caabc 0188c4a8 00603c48 mscorwks!PEFile::CheckSecurity+0xcb     &lt;br /&gt;03e2dc78 7145ec84 d60caa64 00000000 0188c4a8 mscorwks!PEAssembly::DoLoadSignatureChecks+0x3a     &lt;br /&gt;03e2dca0 7145f0ca 01879f00 00000000 0188c4a8 mscorwks!PEAssembly::PEAssembly+0x109     &lt;br /&gt;03e2df3c 7145f1c5 0188c4a8 00000000 00000000 mscorwks!PEAssembly::DoOpen+0x103     &lt;br /&gt;03e2dfd0 71459062 0188c4a8 00000000 00000000 mscorwks!PEAssembly::Open+0x79     &lt;br /&gt;03e2e134 71456ace 03e2e15c 00000001 00000000 mscorwks!AppDomain::BindAssemblySpec+0x247 &lt;/div&gt;  &lt;p&gt;Here we see that we’re currently trying to check the certificate revocation list. This is done on a separate thread so this thread is currently doing nothing but waiting. Our next step would be to find this thread, but first we can find out the name of the .dll that we’re trying to verify. Look at the first argument to GetPublisher.&lt;/p&gt;  &lt;div class="DebugSample"&gt;0:019&amp;gt; du &lt;font color="#ff0000"&gt;014443f8&lt;/font&gt;     &lt;br /&gt;014443f8&amp;#160; &amp;quot;C:\Windows\Microsoft.NET\Framewo&amp;quot;     &lt;br /&gt;01444438&amp;#160; &amp;quot;rk\v2.0.50727\Temporary ASP.NET &amp;quot;     &lt;br /&gt;01444478&amp;#160; &amp;quot;Files\scstt\57ae16cd\2f8637d5\as&amp;quot;     &lt;br /&gt;014444b8&amp;#160; &amp;quot;sembly\dl3\078f3d05\00fba208_c03&amp;quot;     &lt;br /&gt;014444f8&amp;#160; &amp;quot;6ca01\Microsoft.Practices.Enterp&amp;quot;     &lt;br /&gt;01444538&amp;#160; &amp;quot;riseLibrary.Logging.DLL&amp;quot; &lt;/div&gt;  &lt;p&gt;So it’s a Microsoft .dll that is part of the Enterprise Library. Good to know. Now let’s find the thread that is attempting to retrieve the revocation list by running ~*kb and scanning through the threads until we find this one:&lt;/p&gt;  &lt;div class="DebugSample"&gt;0:021&amp;gt; kb2000    &lt;br /&gt;ChildEBP RetAddr&amp;#160; Args to Child&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;0427d7f8 776d9254 75502283 0000070c 00000001 ntdll!KiFastSystemCallRet     &lt;br /&gt;0427d7fc 75502283 0000070c 00000001 0427d824 ntdll!ZwWaitForSingleObject+0xc     &lt;br /&gt;0427d83c 75501fc8 0000070c 00000714 00000001 mswsock!SockWaitForSingleObject+0x19f     &lt;br /&gt;0427d928 77801693 00000001 00000000 0427d9d0 mswsock!WSPSelect+0x38c     &lt;br /&gt;0427d9a8 72a733e5 00000001 00000000 0427d9d0 ws2_32!select+0x494     &lt;br /&gt;0427e1ec 72a730fd 00000714 0427e210 72a72e88 winhttp!ICSocket::Connect_Start+0x3b0     &lt;br /&gt;0427e1f8 72a72e88 01828250 72a737bc 00000000 winhttp!CFsm_SocketConnect::RunSM+0x42     &lt;br /&gt;0427e210 72a7382b 018b0c60 00000000 00000000 winhttp!CFsm::Run+0x20     &lt;br /&gt;0427e234 72a7467d 01828250 018ccf30 0427e258 winhttp!DoFsm+0x2a     &lt;br /&gt;0427e244 72a74646 0000ea60 00000005 00000020 winhttp!ICSocket::Connect+0x32     &lt;br /&gt;0427e258 72a742b5 0000ea60 00000005 0000ea60 winhttp!ICSocket::Connect+0x13     &lt;br /&gt;0427e2a4 72a74038 01434458 0427e2c8 72a72e88 winhttp!HTTP_REQUEST_HANDLE_OBJECT::OpenConnection_Fsm+0x471     &lt;br /&gt;0427e2b0 72a72e88 01434458 00000000 00000000 winhttp!CFsm_OpenConnection::RunSM+0x37     &lt;br /&gt;0427e2c8 72a7382b 018b0c60 00000000 00000000 winhttp!CFsm::Run+0x20     &lt;br /&gt;0427e2ec 72a74625 01434458 018ccf30 0427e324 winhttp!DoFsm+0x2a     &lt;br /&gt;0427e2fc 72a745bc 00000000 00000000 018b0c60 winhttp!HTTP_REQUEST_HANDLE_OBJECT::OpenConnection+0x2f     &lt;br /&gt;0427e324 72a74526 0141f638 0427e348 72a72e88 winhttp!HTTP_REQUEST_HANDLE_OBJECT::MakeConnection_Fsm+0x9b     &lt;br /&gt;0427e330 72a72e88 0141f638 00000000 00000000 winhttp!CFsm_MakeConnection::RunSM+0x37     &lt;br /&gt;0427e348 72a7382b 018b0c60 00000000 00000000 winhttp!CFsm::Run+0x20     &lt;br /&gt;0427e36c 72a743c1 0141f638 018b0c60 014343c0 winhttp!DoFsm+0x2a     &lt;br /&gt;0427e3ac 72a74339 014343c0 0427e3d0 72a72e88 winhttp!HTTP_REQUEST_HANDLE_OBJECT::SendRequest_Fsm+0x93     &lt;br /&gt;0427e3b8 72a72e88 014343c0 018ccf30 00000000 winhttp!CFsm_SendRequest::RunSM+0x37     &lt;br /&gt;0427e3d0 72a7382b 018b0c60 00000000 00000000 winhttp!CFsm::Run+0x20     &lt;br /&gt;0427e3f4 72a73db0 014343c0 018b0c60 01888820 winhttp!DoFsm+0x2a     &lt;br /&gt;0427e414 72a76f71 00000000 0427e438 72a72e88 winhttp!HTTP_REQUEST_HANDLE_OBJECT::HttpSendRequest_Start+0x2af     &lt;br /&gt;0427e420 72a72e88 01888820 00000001 00000000 winhttp!CFsm_HttpSendRequest::RunSM+0x4c     &lt;br /&gt;0427e438 72a73c3e 018b0c60 00000000 00000000 winhttp!CFsm::Run+0x20     &lt;br /&gt;0427e480 72a73b8b 01888820 018ccf30 00000000 winhttp!StartFsmChain+0xcf     &lt;br /&gt;0427e4c4 72a739d8 018ccf30 00000000 00000000 winhttp!HttpWrapSendRequest+0x18c     &lt;br /&gt;0427e544 742599b4 018ccf30 00000000 00000000 winhttp!WinHttpSendRequest+0x19b     &lt;br /&gt;0427f5e4 74259741 005f7bc0 018ccf30 01898e60 cryptnet!InetSendAuthenticatedRequestAndReceiveResponse+0x56f     &lt;br /&gt;0427f6ec 7425921d 005f7bc0 &lt;font color="#ff0000"&gt;01898e60&lt;/font&gt; 00202005 cryptnet!InetSendReceiveUrlRequest+0x2c8     &lt;br /&gt;0427f724 742523e9 &lt;font color="#ff0000"&gt;01898e60&lt;/font&gt; 00000002 00202005 cryptnet!CInetSynchronousRetriever::RetrieveObjectByUrl+0x5f     &lt;br /&gt;0427f75c 742521a8 &lt;font color="#ff0000"&gt;01898e60&lt;/font&gt; 00000002 00202005 cryptnet!InetRetrieveEncodedObject+0x64     &lt;br /&gt;0427f7b8 74256350 &lt;font color="#ff0000"&gt;01898e60&lt;/font&gt; 00000002 00202005 cryptnet!CObjectRetrievalManager::RetrieveObjectByUrl+0xbb     &lt;br /&gt;0427f810 76ad4911 00000000 0427f85c 776be4b6 cryptnet!CryptRetrieveObjectByUrlWithTimeoutThreadProc+0x67     &lt;br /&gt;0427f81c 776be4b6 01898db0 4e080acf 00000000 kernel32!BaseThreadInitThunk+0xe     &lt;br /&gt;0427f85c 776be489 742562f7 01898db0 ffffffff ntdll!__RtlUserThreadStart+0x23     &lt;br /&gt;0427f874 00000000 742562f7 01898db0 00000000 ntdll!_RtlUserThreadStart+0x1b     &lt;br /&gt;0:021&amp;gt; du &lt;font color="#ff0000"&gt;01898e60&lt;/font&gt;     &lt;br /&gt;01898e60&amp;#160; &amp;quot;http://crl.microsoft.com/pki/crl&amp;quot;     &lt;br /&gt;01898ea0&amp;#160; &amp;quot;/products/CodeSignPCA2.crl&amp;quot; &lt;/div&gt;  &lt;p&gt;This is the thread. To finally verify that it is in fact attempting to download the Certificate Revocation List we can check the value of the first argument to cryptnet!CInetSynchronousRetriever, InetRetrieveEncodedObject and CObjectRetrievalManager::RetrieveObjectByUrl or the second argument to cryptnet!InetSendReceiveUrlRequest as I did above.&lt;/p&gt;  &lt;h1&gt;Conclusion&lt;/h1&gt;  &lt;p&gt;In this case the customer chose to disable Signature Verification completely rather than granting Internet access to the server.&lt;/p&gt;  &lt;p&gt;If you found the windbg-portion of this post hard to understand I can recommend a closer look at my Debugging School (In the menu to the left). Begin with &lt;a title="Getting started with windbg - Part I" href="http://blogs.msdn.com/johan/archive/2007/11/13/getting-started-with-windbg-part-i.aspx"&gt;Getting started with windbg - Part I&lt;/a&gt; and you should be set to go in no time.&lt;/p&gt;  &lt;p&gt;/ Johan&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9921295" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/johan/archive/tags/Performance/default.aspx">Performance</category><category domain="http://blogs.msdn.com/johan/archive/tags/Worker+Process/default.aspx">Worker Process</category><category domain="http://blogs.msdn.com/johan/archive/tags/Debugging+School/default.aspx">Debugging School</category><category domain="http://blogs.msdn.com/johan/archive/tags/Did+you+know_3F00_/default.aspx">Did you know?</category><category domain="http://blogs.msdn.com/johan/archive/tags/Hangs/default.aspx">Hangs</category></item><item><title>Investigating Locks</title><link>http://blogs.msdn.com/johan/archive/2009/10/09/investigating-locks.aspx</link><pubDate>Fri, 09 Oct 2009 16:49:56 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9905467</guid><dc:creator>JohanS</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/johan/comments/9905467.aspx</comments><wfw:commentRss>http://blogs.msdn.com/johan/commentrss.aspx?PostID=9905467</wfw:commentRss><description>&lt;p&gt;Consider the following scenario:&lt;/p&gt;  &lt;p&gt;You have an ASP.NET application which intermittently responds sluggishly. As the problem occurs memory usage is about average, as is CPU usage, but still certain pages respond slower and slower. The machine acts just as if it is under heavy load, but judging from the CPU it isn't. In fact CPU usage might even &lt;em&gt;decrease&lt;/em&gt; rather than increase. When trying to access non .NET content such as plain text/html or images you usually find that response times are just as fast as ever.&lt;/p&gt;  &lt;p&gt;When you find that your application has hung in a low CPU state it is usually because of one of the following reasons (in order of likelihood based on my experience) :&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;External resources responding slowly. E.g. a database query or AD lookup is taking a long time to complete and so the application is simply waiting for another server to respond. &lt;/li&gt;    &lt;li&gt;One of the threads of the application has entered a critical section and now several other threads are waiting to enter the same critical section. &lt;/li&gt;    &lt;li&gt;A classic deadlock. Thread A waits for thread B which waits for thread C which waits for thread A. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Quite often you'll see a mixture of items 1 and 2. A thread enters a critical section, calls a remote database, or similar, and all other threads attempting to enter the same critical section will have to nicely stay in line until the struggling database has responded. Still, it is quite possible that the critical section is waiting for a local event to finish, but then you'd usually see a higher CPU load on the machine. (Though not necessarily in the w3wp.exe process.)&lt;/p&gt;  &lt;h1&gt;What are Critical Sections?&lt;/h1&gt;  &lt;p&gt;In case you've forgotten or simply not worked that much with critical sections it might be necessary to refresh your memory on this.&lt;/p&gt;  &lt;p&gt;A Critical Section is a segment of code that you do not want to be executed more than one at a time. In order to ensure this you use the &lt;strong&gt;lock&lt;/strong&gt; keyword to ensure that a certain block of code is able to complete with no interruption from any other threads. To illustrate this I've created the following code sample:&lt;/p&gt;  &lt;div class="SampleCode"&gt;   &lt;pre&gt;public class FileIO
{
    private static object myLock = new object();

	public FileIO()
	{
	}

    public string performLockOperation()
    {
        string strResult = &amp;quot;The Lock Operation started on &amp;quot; + System.DateTime.Now.ToLongTimeString();
        lock (myLock)
        {
            // Let the thread sleep for 10 seconds
            // This way we simulate a File IO operation that takes some time to complete.
            System.Threading.Thread.Sleep(10000);
        }
        strResult += &amp;quot; and ended on &amp;quot; + System.DateTime.Now.ToLongTimeString();
        return strResult;
    }

    public string performNoLockOperation()
    {
        string strResult = &amp;quot;The No Lock Operation started on &amp;quot; + System.DateTime.Now.ToLongTimeString();
        System.Threading.Thread.Sleep(10000);
        strResult += &amp;quot; and ended on &amp;quot; + System.DateTime.Now.ToLongTimeString();
        return strResult;
    }

}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Let's take a quick look at the parts of this class that I've written, called FileIO:&lt;/p&gt;

&lt;h2&gt;&lt;/h2&gt;

&lt;h2&gt;myLock&lt;/h2&gt;

&lt;p&gt;The class has a static variable called myLock that I will be using to identify the lock I'm about to create. This is why the variable is static. Otherwise I'd be creating new locks for each instance of the FileIO class leaving the lock operation completely redundant. Now that I use a static variable the lock spans all instances of the FileIO class.&lt;/p&gt;

&lt;h2&gt;constructor&lt;/h2&gt;

&lt;p&gt;The constructor is empty. Move along. Nothing to see here.&lt;/p&gt;

&lt;h2&gt;performLockOperation&lt;/h2&gt;

&lt;p&gt;This is the most interesting part of the class. It is the function we'll be using to actually reproduce the potential problems. The function returns a string which will contain information about when the call to the function was made and when it completed. We store this data in a string called strResult which we will eventually be returning as the result of the function call.&lt;/p&gt;

&lt;p&gt;Having declared this variable and put the initial time of the function call in it we then create our lock. This is simply done with the following syntax:&lt;/p&gt;

&lt;div class="SampleCode"&gt;
  &lt;pre&gt;lock (object)
{
}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Any code within this block will first make sure that there is not already a lock taken on this object. If there is, then they will pause execution and wait for the lock to become available before continuing execution.&lt;/p&gt;

&lt;p&gt;Inside our lock we then simulate a slow File IO operation by letting the thread sleep for 10 seconds.&lt;/p&gt;

&lt;p&gt;After that we append the current time to the result and return it.&lt;/p&gt;

&lt;h2&gt;performNoLockOperation&lt;/h2&gt;

&lt;p&gt;This function is identical to the previous one, except this time we do not have a critical section. This function is included just for comparison.&lt;/p&gt;

&lt;h1&gt;The potential problem&lt;/h1&gt;

&lt;p&gt;Now, let's get down to business. If we have a web page that makes a call to the performLockOperation-function and that page is requested at the same time by four different clients. What would be the response times?&lt;/p&gt;

&lt;p&gt;The answer is 10, 20, 30 &amp;amp; 40 seconds.&lt;/p&gt;

&lt;p&gt;Here's why:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;The thread handling the first request enters the critical section, effectively locking it for everyone else. When it is complete 10 seconds have passed due to the Sleep-call. &lt;/li&gt;

  &lt;li&gt;One of the other threads enters the critical section once the first request is finished. It has already waited for 10 seconds, and the thread will now sleep for an additional 10 seconds. &lt;/li&gt;

  &lt;li&gt;As the second thread finishes one of the remaining two enters the critical section. It has now waited for 20 seconds and will sleep for an additional 10. &lt;/li&gt;

  &lt;li&gt;The final request is able to enter the critical section after having waited for 30 seconds. Once it is complete 40 seconds have passed. &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If we'd been using the performNoLockOperation instead then all requests would have responded after 10 seconds.&lt;/p&gt;

&lt;p&gt;Now, I know that 10 seconds is an exceptionally long time to let the thread sleep, but this was all for illustration purposes. Imagine instead that the sleeping time was 1 second and the number of requests was 200...&lt;/p&gt;

&lt;h1&gt;&lt;/h1&gt;

&lt;h1&gt;Troubleshooting this issue&lt;/h1&gt;

&lt;p&gt;Okay, so what would it look like when this problem occurs? Let's have a look. If you haven't looked at my posts on getting started with Windbg, then I suggest reading them before continuing. (&lt;a href="http://blogs.msdn.com/johan/archive/2007/11/13/getting-started-with-windbg-part-i.aspx"&gt;Part I&lt;/a&gt; &amp;amp; &lt;a href="http://blogs.msdn.com/johan/archive/2008/05/28/powershell-an-introduction-part-ii.aspx"&gt;Part II&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;First of all I fire up WinDbg, then I attach to the w3wp.exe. I then use &amp;quot;~*e!clrstack&amp;quot; to look at the managed threads of the w3wp.exe application. Here is a snippet of what I get:&lt;/p&gt;

&lt;div class="DebugSample"&gt;
  &lt;pre&gt;OS Thread Id: 0xce0 (24)
Child-SP         RetAddr          Call Site
000000000447e0f0 000007ff001e13d2 FileIO.performLockOperation()
000000000447e170 000007feee323ec9 _Default.Page_Load(System.Object, System.EventArgs)
000000000447e1b0 000007fee7956aea System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr, System.Object, System.Object, System.EventArgs)
000000000447e1e0 000007fee794d2c4 System.Web.Util.CalliEventHandlerDelegateProxy.Callback(System.Object, System.EventArgs)
000000000447e210 000007fee794d322 System.Web.UI.Control.OnLoad(System.EventArgs)
000000000447e250 000007fee79498ac System.Web.UI.Control.LoadRecursive()
000000000447e2a0 000007fee7948db0 System.Web.UI.Page.ProcessRequestMain(Boolean, Boolean)
000000000447e370 000007fee7948cdb System.Web.UI.Page.ProcessRequest(Boolean, Boolean)
000000000447e3d0 000007fee7948c70 System.Web.UI.Page.ProcessRequest()
000000000447e430 000007ff001e0c09 System.Web.UI.Page.ProcessRequest(System.Web.HttpContext)
000000000447e490 000007fee7950117 ASP.default_aspx.ProcessRequest(System.Web.HttpContext)
000000000447e4c0 000007fee791449b System.Web.HttpApplication+CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
000000000447e570 000007fee7ffbd41 System.Web.HttpApplication.ExecuteStep(IExecutionStep, Boolean ByRef)
000000000447e610 000007fee7fed132 System.Web.HttpApplication+PipelineStepManager.ResumeSteps(System.Exception)
000000000447e7a0 000007fee7fcf599 System.Web.HttpApplication.BeginProcessRequestNotification(System.Web.HttpContext, System.AsyncCallback)
000000000447e7f0 000007fee80f5344 System.Web.HttpRuntime.ProcessRequestNotificationPrivate(System.Web.Hosting.IIS7WorkerRequest, System.Web.HttpContext)
000000000447e910 000007fee80f65bb System.Web.Hosting.PipelineRuntime.ProcessRequestNotificationHelper(IntPtr, IntPtr, IntPtr, Int32)
000000000447ea80 000007fee80f4994 System.Web.Hosting.PipelineRuntime.ProcessRequestNotification(IntPtr, IntPtr, IntPtr, Int32)
000000000447eae0 000007fef72701ea DomainNeutralILStubClass.IL_STUB(Int64, Int64, Int64, Int32)
000000000447f310 000007fee80f5424 DomainNeutralILStubClass.IL_STUB(IntPtr, System.Web.RequestNotificationStatus ByRef)
000000000447f3f0 000007fee80f65bb System.Web.Hosting.PipelineRuntime.ProcessRequestNotificationHelper(IntPtr, IntPtr, IntPtr, Int32)
000000000447f560 000007fee80f4994 System.Web.Hosting.PipelineRuntime.ProcessRequestNotification(IntPtr, IntPtr, IntPtr, Int32)
000000000447f5c0 000007fef727043b DomainNeutralILStubClass.IL_STUB(Int64, Int64, Int64, Int32)
OS Thread Id: 0x15ec (25)
Unable to walk the managed stack. The current thread is likely not a 
managed thread. You can run !threads to get a list of managed threads in
the process
OS Thread Id: 0x1958 (26)
Child-SP         RetAddr          Call Site
0000000004c1dd10 000007ff001e13d2 FileIO.performLockOperation()
0000000004c1dd90 000007feee323ec9 _Default.Page_Load(System.Object, System.EventArgs)
0000000004c1ddd0 000007fee7956aea System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr, System.Object, System.Object, System.EventArgs)
0000000004c1de00 000007fee794d2c4 System.Web.Util.CalliEventHandlerDelegateProxy.Callback(System.Object, System.EventArgs)
0000000004c1de30 000007fee794d322 System.Web.UI.Control.OnLoad(System.EventArgs)
0000000004c1de70 000007fee79498ac System.Web.UI.Control.LoadRecursive()
0000000004c1dec0 000007fee7948db0 System.Web.UI.Page.ProcessRequestMain(Boolean, Boolean)
0000000004c1df90 000007fee7948cdb System.Web.UI.Page.ProcessRequest(Boolean, Boolean)
0000000004c1dff0 000007fee7948c70 System.Web.UI.Page.ProcessRequest()
0000000004c1e050 000007ff001e0c09 System.Web.UI.Page.ProcessRequest(System.Web.HttpContext)
0000000004c1e0b0 000007fee7950117 ASP.default_aspx.ProcessRequest(System.Web.HttpContext)
0000000004c1e0e0 000007fee791449b System.Web.HttpApplication+CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
0000000004c1e190 000007fee7ffbd41 System.Web.HttpApplication.ExecuteStep(IExecutionStep, Boolean ByRef)
0000000004c1e230 000007fee7fed132 System.Web.HttpApplication+PipelineStepManager.ResumeSteps(System.Exception)
0000000004c1e3c0 000007fee7fcf599 System.Web.HttpApplication.BeginProcessRequestNotification(System.Web.HttpContext, System.AsyncCallback)
0000000004c1e410 000007fee80f5344 System.Web.HttpRuntime.ProcessRequestNotificationPrivate(System.Web.Hosting.IIS7WorkerRequest, System.Web.HttpContext)
0000000004c1e530 000007fee80f65bb System.Web.Hosting.PipelineRuntime.ProcessRequestNotificationHelper(IntPtr, IntPtr, IntPtr, Int32)
0000000004c1e6a0 000007fee80f4994 System.Web.Hosting.PipelineRuntime.ProcessRequestNotification(IntPtr, IntPtr, IntPtr, Int32)
0000000004c1e700 000007fef72701ea DomainNeutralILStubClass.IL_STUB(Int64, Int64, Int64, Int32)
0000000004c1ef30 000007fee80f5424 DomainNeutralILStubClass.IL_STUB(IntPtr, System.Web.RequestNotificationStatus ByRef)
0000000004c1f010 000007fee80f65bb System.Web.Hosting.PipelineRuntime.ProcessRequestNotificationHelper(IntPtr, IntPtr, IntPtr, Int32)
0000000004c1f180 000007fee80f4994 System.Web.Hosting.PipelineRuntime.ProcessRequestNotification(IntPtr, IntPtr, IntPtr, Int32)
0000000004c1f1e0 000007fef727043b DomainNeutralILStubClass.IL_STUB(Int64, Int64, Int64, Int32)
OS Thread Id: 0x1e28 (27)
Child-SP         RetAddr          Call Site
000000000492dcf0 000007ff001e13d2 FileIO.performLockOperation()
000000000492dd70 000007feee323ec9 _Default.Page_Load(System.Object, System.EventArgs)
000000000492ddb0 000007fee7956aea System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr, System.Object, System.Object, System.EventArgs)
000000000492dde0 000007fee794d2c4 System.Web.Util.CalliEventHandlerDelegateProxy.Callback(System.Object, System.EventArgs)
000000000492de10 000007fee794d322 System.Web.UI.Control.OnLoad(System.EventArgs)
000000000492de50 000007fee79498ac System.Web.UI.Control.LoadRecursive()
000000000492dea0 000007fee7948db0 System.Web.UI.Page.ProcessRequestMain(Boolean, Boolean)
000000000492df70 000007fee7948cdb System.Web.UI.Page.ProcessRequest(Boolean, Boolean)
000000000492dfd0 000007fee7948c70 System.Web.UI.Page.ProcessRequest()
000000000492e030 000007ff001e0c09 System.Web.UI.Page.ProcessRequest(System.Web.HttpContext)
000000000492e090 000007fee7950117 ASP.default_aspx.ProcessRequest(System.Web.HttpContext)
000000000492e0c0 000007fee791449b System.Web.HttpApplication+CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
000000000492e170 000007fee7ffbd41 System.Web.HttpApplication.ExecuteStep(IExecutionStep, Boolean ByRef)
000000000492e210 000007fee7fed132 System.Web.HttpApplication+PipelineStepManager.ResumeSteps(System.Exception)
000000000492e3a0 000007fee7fcf599 System.Web.HttpApplication.BeginProcessRequestNotification(System.Web.HttpContext, System.AsyncCallback)
000000000492e3f0 000007fee80f5344 System.Web.HttpRuntime.ProcessRequestNotificationPrivate(System.Web.Hosting.IIS7WorkerRequest, System.Web.HttpContext)
000000000492e510 000007fee80f65bb System.Web.Hosting.PipelineRuntime.ProcessRequestNotificationHelper(IntPtr, IntPtr, IntPtr, Int32)
000000000492e680 000007fee80f4994 System.Web.Hosting.PipelineRuntime.ProcessRequestNotification(IntPtr, IntPtr, IntPtr, Int32)
000000000492e6e0 000007fef72701ea DomainNeutralILStubClass.IL_STUB(Int64, Int64, Int64, Int32)
000000000492ef10 000007fee80f5424 DomainNeutralILStubClass.IL_STUB(IntPtr, System.Web.RequestNotificationStatus ByRef)
000000000492eff0 000007fee80f65bb System.Web.Hosting.PipelineRuntime.ProcessRequestNotificationHelper(IntPtr, IntPtr, IntPtr, Int32)
000000000492f160 000007fee80f4994 System.Web.Hosting.PipelineRuntime.ProcessRequestNotification(IntPtr, IntPtr, IntPtr, Int32)
000000000492f1c0 000007fef727043b DomainNeutralILStubClass.IL_STUB(Int64, Int64, Int64, Int32)
OS Thread Id: 0x1c38 (28)
Child-SP         RetAddr          Call Site
0000000004d0e0b0 000007ff001e13d2 FileIO.performLockOperation()
0000000004d0e130 000007feee323ec9 _Default.Page_Load(System.Object, System.EventArgs)
0000000004d0e170 000007fee7956aea System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr, System.Object, System.Object, System.EventArgs)
0000000004d0e1a0 000007fee794d2c4 System.Web.Util.CalliEventHandlerDelegateProxy.Callback(System.Object, System.EventArgs)
0000000004d0e1d0 000007fee794d322 System.Web.UI.Control.OnLoad(System.EventArgs)
0000000004d0e210 000007fee79498ac System.Web.UI.Control.LoadRecursive()
0000000004d0e260 000007fee7948db0 System.Web.UI.Page.ProcessRequestMain(Boolean, Boolean)
0000000004d0e330 000007fee7948cdb System.Web.UI.Page.ProcessRequest(Boolean, Boolean)
0000000004d0e390 000007fee7948c70 System.Web.UI.Page.ProcessRequest()
0000000004d0e3f0 000007ff001e0c09 System.Web.UI.Page.ProcessRequest(System.Web.HttpContext)
0000000004d0e450 000007fee7950117 ASP.default_aspx.ProcessRequest(System.Web.HttpContext)
0000000004d0e480 000007fee791449b System.Web.HttpApplication+CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
0000000004d0e530 000007fee7ffbd41 System.Web.HttpApplication.ExecuteStep(IExecutionStep, Boolean ByRef)
0000000004d0e5d0 000007fee7fed132 System.Web.HttpApplication+PipelineStepManager.ResumeSteps(System.Exception)
0000000004d0e760 000007fee7fcf599 System.Web.HttpApplication.BeginProcessRequestNotification(System.Web.HttpContext, System.AsyncCallback)
0000000004d0e7b0 000007fee80f5344 System.Web.HttpRuntime.ProcessRequestNotificationPrivate(System.Web.Hosting.IIS7WorkerRequest, System.Web.HttpContext)
0000000004d0e8d0 000007fee80f65bb System.Web.Hosting.PipelineRuntime.ProcessRequestNotificationHelper(IntPtr, IntPtr, IntPtr, Int32)
0000000004d0ea40 000007fee80f4994 System.Web.Hosting.PipelineRuntime.ProcessRequestNotification(IntPtr, IntPtr, IntPtr, Int32)
0000000004d0eaa0 000007fef72701ea DomainNeutralILStubClass.IL_STUB(Int64, Int64, Int64, Int32)
0000000004d0f2d0 000007fee80f5424 DomainNeutralILStubClass.IL_STUB(IntPtr, System.Web.RequestNotificationStatus ByRef)
0000000004d0f3b0 000007fee80f65bb System.Web.Hosting.PipelineRuntime.ProcessRequestNotificationHelper(IntPtr, IntPtr, IntPtr, Int32)
0000000004d0f520 000007fee80f4994 System.Web.Hosting.PipelineRuntime.ProcessRequestNotification(IntPtr, IntPtr, IntPtr, Int32)
0000000004d0f580 000007fef727043b DomainNeutralILStubClass.IL_STUB(Int64, Int64, Int64, Int32&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;So, what does this tell us?&lt;/p&gt;

&lt;p&gt;Well, obviously we have four threads that call my function FileIO.performLockOperation() from Page_Load.&lt;/p&gt;

&lt;p&gt;Please note that we don't have any additional callstack, and since the performLockOperation-function was named by me it could just as well have been named &amp;quot;foo&amp;quot;. In order to find out that these threads are actually waiting for a lock we need to look at the native callstack using the kb-command. Let's take a look at thread 24: &lt;/p&gt;

&lt;div class="DebugSample"&gt;
  &lt;pre&gt;0:029&amp;gt; ~24kb
ntdll!NtDelayExecution+0xa
kernel32!SleepEx+0x84
mscorwks!EESleepEx+0x2d
mscorwks!Thread::UserSleep+0x71
mscorwks!&lt;font color="#ff0000"&gt;ThreadNative::Sleep&lt;/font&gt;+0xf9
App_Code_tvh3usvo!&lt;font color="#ff0000"&gt;FileIO.performLockOperation&lt;/font&gt;()+0x8a
App_Web_uywrbugj!_Default.Page_Load(System.Object, System.EventArgs)+0x32
System_Web_RegularExpressions_ni!System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr, System.Object, System.Object, System.EventArgs)+0x19
System_Web_ni!System.Web.Util.CalliEventHandlerDelegateProxy.Callback(System.Object, System.EventArgs)+0x2a
System_Web_ni!System.Web.UI.Control.OnLoad(System.EventArgs)+0x84
System_Web_ni!System.Web.UI.Control.LoadRecursive()+0x42
System_Web_ni!System.Web.UI.Page.ProcessRequestMain(Boolean, Boolean)+0x97c
System_Web_ni!System.Web.UI.Page.ProcessRequest(Boolean, Boolean)+0xa0
System_Web_ni!System.Web.UI.Page.ProcessRequest()+0x5b
System_Web_ni!System.Web.UI.Page.ProcessRequest(System.Web.HttpContext)+0xf0
App_Web_uywrbugj!ASP.default_aspx.ProcessRequest(System.Web.HttpContext)+0x9
System_Web_ni!System.Web.HttpApplication+CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()+0x257
System_Web_ni!System.Web.HttpApplication.ExecuteStep(IExecutionStep, Boolean ByRef)+0xab
System_Web_ni!System.Web.HttpApplication+PipelineStepManager.ResumeSteps(System.Exception)+0x501
System_Web_ni!System.Web.HttpApplication.BeginProcessRequestNotification(System.Web.HttpContext, System.AsyncCallback)+0x72&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Apparently we entered FileIO.performLockOperation, and then called sleep, (which is what we're doing in this repro in order to simulate a slow IO operation.) So, what do the other threads look like? Here's thread 26:&lt;/p&gt;

&lt;div class="DebugSample"&gt;
  &lt;pre&gt;0:029&amp;gt; ~26kb
ntdll!ZwWaitForMultipleObjects+0xa
kernel32!WaitForMultipleObjectsEx+0x10b
mscorwks!WaitForMultipleObjectsEx_SO_TOLERANT+0xc1
mscorwks!Thread::DoAppropriateAptStateWait+0x41
mscorwks!Thread::DoAppropriateWaitWorker+0x191
mscorwks!Thread::DoAppropriateWait+0x5c
mscorwks!&lt;font color="#ff0000"&gt;CLREvent::WaitEx&lt;/font&gt;+0xbe
mscorwks!AwareLock::EnterEpilog+0xc9
mscorwks!AwareLock::Enter+0x72
mscorwks!AwareLock::Contention+0x1fb
mscorwks!JITutil_MonContention+0xdf
App_Code_tvh3usvo!&lt;font color="#ff0000"&gt;FileIO.performLockOperation&lt;/font&gt;()+0x7f
App_Web_uywrbugj!_Default.Page_Load(System.Object, System.EventArgs)+0x32
System_Web_RegularExpressions_ni!System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr, System.Object, System.Object, System.EventArgs)+0x19
System_Web_ni!System.Web.Util.CalliEventHandlerDelegateProxy.Callback(System.Object, System.EventArgs)+0x2a
System_Web_ni!System.Web.UI.Control.OnLoad(System.EventArgs)+0x84
System_Web_ni!System.Web.UI.Control.LoadRecursive()+0x42
System_Web_ni!System.Web.UI.Page.ProcessRequestMain(Boolean, Boolean)+0x97c
System_Web_ni!System.Web.UI.Page.ProcessRequest(Boolean, Boolean)+0xa0
System_Web_ni!System.Web.UI.Page.ProcessRequest()+0x5b&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;This is one of the threads waiting for the critical section. It then found that it was unable to get a lock and so began waiting for the critical section on thread 24 to end.&lt;/p&gt;

&lt;h1&gt;Resolving the problem&lt;/h1&gt;

&lt;p&gt;This is the tricky part. There is no quick-fix for this. We can use the debugger to identify the bottleneck, but after that we'll need to review our design in order to get this working smoothly. A couple of generic things to try would be the following:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Review what you're doing inside the critical section. Is it really necessary to perform all of the operations you're doing, or would it be possible to do some/all of them outside the scope of the critical section?&lt;/li&gt;

  &lt;li&gt;Identify the reason for the lock taking so much time. Can it be resolved by load-balancing or clustering the resource we're waiting for?&lt;/li&gt;

  &lt;li&gt;If we're waiting for another server, make sure the physical infrastructure is okay. Are network response times within the expected parameters or do you need to fix your wiring, router, etc?&lt;/li&gt;

  &lt;li&gt;Are &lt;em&gt;all &lt;/em&gt;calls to the critical section taking the same amount of time, or are there certain calls that take an &lt;em&gt;exceptional&lt;/em&gt; amount of time? Perhaps most calls to the function are just fine, but intermittently a call comes along that tries to get &lt;em&gt;everything &lt;/em&gt;from the AD, database, etc. In order to investigate this I'd use the commands outlined in &lt;a href="http://blogs.msdn.com/johan/archive/2007/11/26/getting-started-with-windbg-part-ii.aspx"&gt;Getting started with windbg -part II&lt;/a&gt;. Identify the thread owning the lock and investigate the callstack and stack objects using !clrstack and !dso. Use !dso and !do to query the stack objects and try to find the SQL query or AD query that is causing the thread to take such a long time to finish. Is the query significantly different from the ones waiting to execute, then this is most likely our culprit.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;Post Script&lt;/h1&gt;

&lt;p&gt;A quick thought on locks and their limits:&lt;/p&gt;

&lt;p&gt;Locks do not scale well. A lock can only be made within a specific process, so if you're using a web farm, or in any other way more than one w3wp.exe, then you will not be able to lock &lt;em&gt;all &lt;/em&gt;processes. In other words. Server 1 can get a lock, and so can Server 2. Both will happily execute their code independent of each other. For products such as SQL server you'd deal with this in your SQL query, but if you're performing other operations, such as File IO you might have to work around this by using the same approach as Ms Word. Create a lock file in a shared space, and before you enter your critical section you simply check if the file exists:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;You are entering your critical section. Look for lock file in shared location&lt;/li&gt;

  &lt;li&gt;If file exists, then wait&lt;/li&gt;

  &lt;li&gt;If/when file doesn't/no longer exist, create file and enter critical section&lt;/li&gt;

  &lt;li&gt;Make sure you have &lt;em&gt;solid&lt;/em&gt; exception handling within the critical section so that you under no circumstances leave the critical section without removing the lock file.&lt;/li&gt;

  &lt;li&gt;When done, remove lock file&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;/ Johan&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9905467" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/johan/archive/tags/Performance/default.aspx">Performance</category><category domain="http://blogs.msdn.com/johan/archive/tags/WinDbg/default.aspx">WinDbg</category><category domain="http://blogs.msdn.com/johan/archive/tags/Debugging+School/default.aspx">Debugging School</category><category domain="http://blogs.msdn.com/johan/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://blogs.msdn.com/johan/archive/tags/Hangs/default.aspx">Hangs</category></item><item><title>Walkthrough - Troubleshooting a native memory leak</title><link>http://blogs.msdn.com/johan/archive/2008/02/21/walkthrough-troubleshooting-a-native-memory-leak.aspx</link><pubDate>Thu, 21 Feb 2008 18:38:50 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:7838997</guid><dc:creator>JohanS</dc:creator><slash:comments>21</slash:comments><comments>http://blogs.msdn.com/johan/comments/7838997.aspx</comments><wfw:commentRss>http://blogs.msdn.com/johan/commentrss.aspx?PostID=7838997</wfw:commentRss><description>&lt;h1&gt;Problem:&lt;/h1&gt; &lt;p&gt;A customer called in. They had a Web Service running on a single IIS6. Memory usage would slowly increase and not be released. As a workaround they'd currently set the application pool to recycle at 500 MB, causing a few failed requests upon each restart.&lt;/p&gt; &lt;p&gt;I thought I'd describe how I went about troubleshooting this scenario.&lt;/p&gt; &lt;hr&gt;  &lt;h1&gt;&amp;nbsp;&lt;/h1&gt; &lt;h1&gt;The first dump&lt;/h1&gt; &lt;p&gt;The customer had already taken a memory dump using &lt;a href="http://blogs.msdn.com/johan/pages/useful-tools.aspx"&gt;DebugDiag&lt;/a&gt;, so obviously I asked them to upload it. It was a huge dump. 1.64 GB!&amp;nbsp;I opened it up in windbg and ran the following command:&lt;/p&gt; &lt;h2&gt;!eeheap -gc&lt;/h2&gt; &lt;p&gt;I haven't mentioned !eeheap before. It gives me a nice summary of what's on the managed heap(s).&lt;/p&gt; &lt;div class="DebugSample"&gt;0:000&amp;gt; !eeheap -gc&lt;br&gt;Number of GC Heaps: 4&lt;br&gt;------------------------------&lt;br&gt;Heap 0 (0x000dfaf0)&lt;br&gt;generation 0 starts at 0x1124b1c0&lt;br&gt;generation 1 starts at 0x111c3684&lt;br&gt;generation 2 starts at 0x102d0030&lt;br&gt;ephemeral segment allocation context: none&lt;br&gt;segment&amp;nbsp;&amp;nbsp;&amp;nbsp; begin&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; allocated&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; size&lt;br&gt;0x102d0000 0x102d0030&amp;nbsp; 0x1165033c 0x138030c(20,448,012)&lt;br&gt;Large object heap starts at 0x202d0030&lt;br&gt;segment&amp;nbsp;&amp;nbsp;&amp;nbsp; begin&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; allocated&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; size&lt;br&gt;0x202d0000 0x202d0030&amp;nbsp; 0x20636810 0x003667e0(3,565,536)&lt;br&gt;Heap Size&amp;nbsp; 0x16e6aec(24,013,548)&lt;br&gt;------------------------------&lt;br&gt;Heap 1 (0x000dfee8)&lt;br&gt;generation 0 starts at 0x15365b5c&lt;br&gt;generation 1 starts at 0x152f2138&lt;br&gt;generation 2 starts at 0x142d0030&lt;br&gt;ephemeral segment allocation context: none&lt;br&gt;segment&amp;nbsp;&amp;nbsp;&amp;nbsp; begin&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; allocated&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; size&lt;br&gt;0x142d0000 0x142d0030&amp;nbsp; 0x1577d230 0x14ad200(21,680,640)&lt;br&gt;Large object heap starts at 0x252d0030&lt;br&gt;segment&amp;nbsp;&amp;nbsp;&amp;nbsp; begin&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; allocated&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; size&lt;br&gt;0x252d0000 0x252d0030&amp;nbsp; 0x25391190 0x000c1160(790,880)&lt;br&gt;Heap Size&amp;nbsp; 0x156e360(22,471,520)&lt;br&gt;------------------------------&lt;br&gt;Heap 2 (0x000e09f8)&lt;br&gt;generation 0 starts at 0x19480e94&lt;br&gt;generation 1 starts at 0x193ec5b0&lt;br&gt;generation 2 starts at 0x182d0030&lt;br&gt;ephemeral segment allocation context: none&lt;br&gt;segment&amp;nbsp;&amp;nbsp;&amp;nbsp; begin&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; allocated&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; size&lt;br&gt;0x182d0000 0x182d0030&amp;nbsp; 0x1985ed34 0x158ed04(22,605,060)&lt;br&gt;Large object heap starts at 0x222d0030&lt;br&gt;segment&amp;nbsp;&amp;nbsp;&amp;nbsp; begin&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; allocated&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; size&lt;br&gt;0x222d0000 0x222d0030&amp;nbsp; 0x222e8748 0x00018718(100,120)&lt;br&gt;Heap Size&amp;nbsp; 0x15a741c(22,705,180)&lt;br&gt;------------------------------&lt;br&gt;Heap 3 (0x000e14e0)&lt;br&gt;generation 0 starts at 0x1d0f887c&lt;br&gt;generation 1 starts at 0x1d056738&lt;br&gt;generation 2 starts at 0x1c2d0030&lt;br&gt;ephemeral segment allocation context: none&lt;br&gt;segment&amp;nbsp;&amp;nbsp;&amp;nbsp; begin&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; allocated&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; size&lt;br&gt;0x1c2d0000 0x1c2d0030&amp;nbsp; 0x1d56af68 0x129af38(19,509,048)&lt;br&gt;Large object heap starts at 0x232d0030&lt;br&gt;segment&amp;nbsp;&amp;nbsp;&amp;nbsp; begin&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; allocated&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; size&lt;br&gt;0x232d0000 0x232d0030&amp;nbsp; 0x23319578 0x00049548(300,360)&lt;br&gt;Heap Size&amp;nbsp; 0x12e4480(19,809,408)&lt;br&gt;------------------------------&lt;br&gt;GC Heap Size&amp;nbsp; 0x54e06e8(&lt;font color="#ff0000"&gt;88,999,656&lt;/font&gt;)&lt;/div&gt; &lt;p&gt;So, as we can see the managed memory is pretty evenly distributed in the 4 managed heaps.&amp;nbsp;If you look down at the bottom you'll see that total memory usage is at 88 MB. (This is a figure I would have gotten by running !dumpheap -stat as well. So in case you're wondering; that would have worked just as&amp;nbsp;fine.) Anyway, if only ~90 MB is in the managed heap, then the remaining 1.55 GB must be on the native heap.&lt;/p&gt; &lt;h1&gt;New dumps&lt;/h1&gt; &lt;p&gt;Troubleshooting the native heap is a bit harder. The sos extension and windbg is a really nice team so working without them can be tough. Fortunately there is a nice feature included in DebugDiag that lets it perform an automatic analysis. This is usually the best way to get information from a native leak. Sometimes you may want to get a little additional information from windbg as well, but most of the time DebugDiag's auto analysis will get you a long way.&lt;/p&gt; &lt;h2&gt;LeakTrack&lt;/h2&gt; &lt;p&gt;DebugDiag comes with a handy little dll called LeakTrack. LeakTrack attaches to the process in question and monitors memory allocations and their related call stacks. Since the dll is injected into the process it can have a slight impact on performance, but if you want to troubleshoot the process you really have no other options.&lt;/p&gt; &lt;p&gt;There are two ways to start monitoring a process with LeakTrack:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Create a "Memory and Handle Leak"-rule using the wizard normally displayed upon start up.  &lt;li&gt;Cancel the wizard. Go to the "Processes"-tab. Right-click the w3wp.exe you wish to monitor and select "Monitor for leaks".&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;LeakTrack will begin monitoring from the moment you inject it. Obviously, it won't be able to get any data for events that have already occurred, so injecting LeakTrack when memory usage is already at it's peak won't really do much good. Instead I usually recycle the process and attach LeakTrack as soon as possible.&lt;/p&gt; &lt;p&gt;This time I chose to let the customer create a "Memory and Handle Leak"-rule using the wizard. This rule then created dumps at certain intervals which the customer uploaded to me.&lt;/p&gt; &lt;h1&gt;Analyzing the dumps&lt;/h1&gt; &lt;p&gt;So the next step is to let DebugDiag analyze the dumps. Here's how you do it:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Run DebugDiag  &lt;li&gt;Cancel the wizard  &lt;li&gt;Go to the "Advanced Analysis"-tab  &lt;li&gt;"Add Data Files" - point to the dump  &lt;li&gt;Choose "Memory Pressure Analysis" in the "Available Analysis Scripts" list.  &lt;li&gt;Make sure your dump is selected in the "Data Files" list.  &lt;li&gt;"Start Analysis"&lt;/li&gt;&lt;/ol&gt; &lt;h2&gt;The usual suspects&lt;/h2&gt; &lt;p&gt;Once DebugDiag has finished analyzing the dump you will get a new browser window with a report. The report I got showed the following right at the top:&lt;/p&gt; &lt;p&gt;&lt;img src="http://blogs.msdn.com/photos/johan/images/7773735/original.aspx"&gt; &lt;/p&gt; &lt;p&gt;So what does this mean? It means that LeakTrack has monitored the allocations made by a certain third party&amp;nbsp;dll. It has also monitored if that memory has been properly released. All in all the .dll now has almost 150 MB of allocations that are unaccounted for. It would be safe to assume that this is our culprit. Further down in the report we have a link called "Leak analysis report". Clicking it will bring us to the following graphical representation:&lt;/p&gt; &lt;p&gt;&lt;img src="http://blogs.msdn.com/photos/johan/images/7773825/original.aspx"&gt;&lt;/p&gt; &lt;p&gt;As you can see the .dll in question is right at the top. But wait a minute! According to the graph mscorsvr has ~9 MB of outstanding allocations as well. Does this mean that mscorsvr is leaking too, though not as much?&lt;/p&gt; &lt;p&gt;The answer is no. As I mentioned before; LeakTrack will monitor all allocations and check that the memory is properly released as well. All we know is that mscorsvr has allocated 8,75 MB of memory that hasn't been released &lt;em&gt;yet.&lt;/em&gt; There's nothing to suggest it won't release it eventually. The odds of the stray 148 MB eventually being released, on the other hand, are a lot slimmer in my opinion.&lt;/p&gt; &lt;h2&gt;What causes the leak?&lt;/h2&gt; &lt;p&gt;Since the dll responsible for the allocations is third party I can't find out &lt;em&gt;exactly&lt;/em&gt; what causes the leak within the third party dll. What I &lt;em&gt;can&lt;/em&gt; find out is what calls in the customer's code lead us down the leaking code path in the dll. LeakTrack monitors the callstacks related to memory allocations. Looking at the report I was able to find some nice callstacks that the customer should keep an eye on. It might be possible for them to tweak their code slightly in order to avoid the scenario.&lt;/p&gt; &lt;div class="DebugSample"&gt;3rdparty!IFMX_IsInTransaction+5671 &lt;br&gt;3rdparty!SQLEndTran+e456&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;odbc32!SQLFetch+160&amp;nbsp;&amp;nbsp; &lt;br&gt;[DEFAULT] [hasThis] Boolean System.Data.Odbc.OdbcDataReader.Read()&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;[DEFAULT] [hasThis] I4 System.Data.Common.DbDataAdapter.FillLoadDataRow(Class System.Data.Common.SchemaMapping)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;[DEFAULT] [hasThis] I4 System.Data.Common.DbDataAdapter.FillFromReader(Object,String,Class System.Data.IDataReader,I4,I4,Class System.Data.DataColumn,Object)&lt;br&gt;[DEFAULT] [hasThis] Void System.Data.DataSet.set_EnforceConstraints(Boolean)&lt;br&gt;[DEFAULT] [hasThis] I4 System.Data.Common.DbDataAdapter.Fill(Class System.Data.DataSet,String,Class System.Data.IDataReader,I4,I4)&lt;br&gt;[DEFAULT] [hasThis] Void System.Data.DataSet.set_EnforceConstraints(Boolean)&lt;br&gt;[DEFAULT] [hasThis] I4 System.Data.Common.DbDataAdapter.FillFromCommand(Object,I4,I4,String,Class System.Data.IDbCommand,ValueClass System.Data.CommandBehavior)&lt;br&gt;[DEFAULT] [hasThis] I4 System.Data.Common.DbDataAdapter.Fill(Class System.Data.DataSet,I4,I4,String,Class System.Data.IDbCommand,ValueClass System.Data.CommandBehavior)&lt;br&gt;[DEFAULT] [hasThis] I4 System.Data.Common.DbDataAdapter.Fill(Class System.Data.DataSet)&lt;br&gt;[DEFAULT] [hasThis] Class System.Data.DataSet Company.App.Server.DAL.DAO.Informix.AbstractDAO.Fill(String,String,I4)&lt;br&gt;[DEFAULT] [hasThis] String Company.App.Server.DAL.DAO.Informix.ResourceDAO.SelectResourcePriceType(String,String)&lt;br&gt;[DEFAULT] [hasThis] Class System.Data.DataSet Company.App.Server.DAL.DAO.Informix.AbstractDAO.Fill(String,String,I4)&lt;br&gt;[DEFAULT] [hasThis] Void Company.App.Server.DAL.DAO.Informix.ResourceDAO..ctor(ByRef Class System.Data.IDbConnection,ByRef Class System.Data.IDbTransaction)&lt;br&gt;[DEFAULT] [hasThis] String Company.App.Server.Services.Pricing.PriceFinder.GetPriceType(String,String,ByRef Class System.Data.IDbConnection,Class System.Data.IDbTransaction)&lt;br&gt;[DEFAULT] [hasThis] Class Company.App.Core.Query.Result.PriceResult Company.App.Server.Services.Pricing.PriceFinder.GetResourceDiscountPrices(String,String,ValueClass System.DateTime,String,SZArray R4,String,String,ByRef Class System.Data.IDbConnection,Class System.Data.IDbTransaction)&lt;br&gt;[DEFAULT] [hasThis] String Company.App.Server.Services.Pricing.PriceFinder.GetPriceType(String,String,ByRef Class System.Data.IDbConnection,Class System.Data.IDbTransaction)&lt;br&gt;[DEFAULT] [hasThis] Class Company.App.Core.Query.Result.PriceResult Company.App.Server.Facade.BookingDataSource.GetResourceDiscountPrices(String,String,ValueClass System.DateTime,String,SZArray R4,String,String)&lt;br&gt;[DEFAULT] [hasThis] Class Company.App.Core.Query.Result.PriceResult App.BookingData.GetResourceDiscountPrices(String,String,ValueClass System.DateTime,String,SZArray R4,String,String)&lt;br&gt;[DEFAULT] [hasThis] Class Company.App.Core.Query.Result.PriceResult Company.App.Server.Facade.BookingDataSource.GetResourceDiscountPrices(String,String,ValueClass System.DateTime,String,SZArray R4,String,String)&lt;br&gt;mscorsvr!CallDescrWorker+30&lt;br&gt;mscorsvr!COMMember::InvokeMethod+95a&lt;br&gt;mscorsvr!COMMember::CreateInstance+358&lt;br&gt;[DEFAULT] [hasThis] SZArray Object System.Web.Services.Protocols.LogicalMethodInfo.Invoke(Object,SZArray Object)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;[DEFAULT] [hasThis] Void System.Web.Services.Protocols.WebServiceHandler.Invoke()&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;[DEFAULT] [hasThis] SZArray Object System.Web.Services.Protocols.LogicalMethodInfo.Invoke(Object,SZArray Object) &lt;br&gt;[DEFAULT] [hasThis] Void System.Web.Services.Protocols.WebServiceHandler.CoreProcessRequest()&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;[DEFAULT] [hasThis] Void System.Web.Services.Protocols.WebServiceHandler.Invoke() &lt;br&gt;[DEFAULT] [hasThis] Void System.Web.Services.Protocols.SyncSessionlessHandler.ProcessRequest(Class System.Web.HttpContext)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;[DEFAULT] [hasThis] Void System.Web.Services.Protocols.WebServiceHandler.CoreProcessRequest() &lt;br&gt;[DEFAULT] [hasThis] Void System.Web.HttpApplication/CallHandlerExecutionStep.System.Web.HttpApplication+IExecutionStep.Execute()&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;[DEFAULT] [hasThis] Class System.Exception System.Web.HttpApplication.ExecuteStep(Class IExecutionStep,ByRef Boolean)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;[DEFAULT] [hasThis] Void System.Web.HttpApplication.ResumeSteps(Class System.Exception)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;[DEFAULT] [hasThis] Class System.Exception System.Web.HttpApplication.ExecuteStep(Class IExecutionStep,ByRef Boolean) &lt;br&gt;[DEFAULT] [hasThis] Class System.IAsyncResult System.Web.HttpApplication.System.Web.IHttpAsyncHandler.BeginProcessRequest(Class System.Web.HttpContext,Class System.AsyncCallback,Object)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;[DEFAULT] [hasThis] Void System.Web.HttpApplication.ResumeSteps(Class System.Exception) &lt;br&gt;[DEFAULT] [hasThis] Void System.Web.HttpRuntime.ProcessRequestInternal(Class System.Web.HttpWorkerRequest)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;[DEFAULT] Void System.Web.HttpRuntime.ProcessRequest(Class System.Web.HttpWorkerRequest)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;[DEFAULT] [hasThis] Void System.Web.HttpRuntime.ProcessRequestInternal(Class System.Web.HttpWorkerRequest) &lt;br&gt;[DEFAULT] [hasThis] I4 System.Web.Hosting.ISAPIRuntime.ProcessRequest(I,I4)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;[DEFAULT] Void System.Web.HttpRuntime.ProcessRequest(Class System.Web.HttpWorkerRequest) &lt;br&gt;mscorsvr!ComToComPlusWorker+1e0&amp;nbsp;&amp;nbsp; &lt;br&gt;mscorsvr!ComToComPlusWorker_Wrapper+38&amp;nbsp;&amp;nbsp; &lt;br&gt;mscorsvr!Thread::DoADCallBack+5c&amp;nbsp;&amp;nbsp; &lt;br&gt;mscorsvr!ComToComPlusWorker+65&amp;nbsp;&amp;nbsp; &lt;br&gt;mscorsvr!ComCallWrapper::NeedToSwitchDomains+24&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;aspnet_isapi!HttpCompletion::ProcessRequestInManagedCode+17e&amp;nbsp;&amp;nbsp; &lt;br&gt;aspnet_isapi!HttpCompletion::ProcessCompletion+24&amp;nbsp;&amp;nbsp; &lt;br&gt;aspnet_isapi!CorThreadPoolWorkitemCallback+13&amp;nbsp;&amp;nbsp; &lt;br&gt;mscorsvr!ThreadpoolMgr::ExecuteWorkRequest+19&amp;nbsp;&amp;nbsp; &lt;br&gt;mscorsvr!ThreadpoolMgr::WorkerThreadStart+129&amp;nbsp;&amp;nbsp; &lt;br&gt;mscorsvr!ThreadpoolMgr::intermediateThreadProc+44&amp;nbsp;&amp;nbsp; &lt;br&gt;kernel32!GetModuleHandleForUnicodeString+20&amp;nbsp;&amp;nbsp; &lt;br&gt;kernel32!GetModuleHandleForUnicodeString+20&amp;nbsp;&amp;nbsp; &lt;br&gt;kernel32!BasepGetModuleHandleExW+17f&amp;nbsp;&amp;nbsp; &lt;br&gt;ntdll!LdrpGetProcedureAddress+b3&amp;nbsp;&amp;nbsp; &lt;br&gt;ntdll!LdrpGetProcedureAddress+b3&amp;nbsp;&amp;nbsp; &lt;br&gt;ntdll!LdrpCallInitRoutine+14&amp;nbsp;&amp;nbsp; &lt;br&gt;ntdll!LdrpInitializeThread+18f &lt;br&gt;ntdll!LdrpInitializeThread+18f &lt;br&gt;ntdll!ZwContinue+c&amp;nbsp;&amp;nbsp; &lt;br&gt;kernel32!BaseThreadStart+34&lt;br&gt;&lt;/div&gt; &lt;h1&gt;&amp;nbsp;&lt;/h1&gt; &lt;h1&gt;Okay, now what?&lt;/h1&gt; &lt;p&gt;Well, this is actually more or less where the road ends for me. Had the problem lied within a Microsoft component it would have been up to us to fix it. Had it been within the customer's code I would have been able to use the customers symbols to get a more detailed callstack and provide him with pointers on how to resolve it as well, but since this is a third party component&amp;nbsp;the next step&amp;nbsp;is to forward it to the third-party vendor.&lt;/p&gt; &lt;p&gt;/ Johan&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=7838997" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/johan/archive/tags/WinDbg/default.aspx">WinDbg</category><category domain="http://blogs.msdn.com/johan/archive/tags/Legacy/default.aspx">Legacy</category><category domain="http://blogs.msdn.com/johan/archive/tags/Debugging+School/default.aspx">Debugging School</category></item><item><title>Using WinDbg - Hunting Exceptions</title><link>http://blogs.msdn.com/johan/archive/2008/01/31/using-windbg-hunting-exceptions.aspx</link><pubDate>Thu, 31 Jan 2008 19:39:36 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:7353486</guid><dc:creator>JohanS</dc:creator><slash:comments>7</slash:comments><comments>http://blogs.msdn.com/johan/comments/7353486.aspx</comments><wfw:commentRss>http://blogs.msdn.com/johan/commentrss.aspx?PostID=7353486</wfw:commentRss><description>&lt;h1&gt;Prerequisites&lt;/h1&gt; &lt;p&gt;This post will require some basic knowledge of windbg and the sos extension. For this I recommend looking at the following posts:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href="http://blogs.msdn.com/johan/archive/2007/11/13/getting-started-with-windbg-part-i.aspx"&gt;Getting started with WinDbg - Part I&lt;/a&gt;  &lt;li&gt;&lt;a href="http://blogs.msdn.com/johan/archive/2007/11/26/getting-started-with-windbg-part-ii.aspx"&gt;Getting started with WinDbg - Part II&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;For more information on Exceptions in general and why they should be avoided&amp;nbsp;I'd like to recommend this post:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href="http://blogs.msdn.com/johan/archive/2008/01/18/exceptions.aspx"&gt;Exceptions&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;h1&gt;Introduction&lt;/h1&gt; &lt;p&gt;I thought it was time to write another post on how to use windbg for troubleshooting. A lot of my time is spent locating exceptions in various web applications, so I thought this might be a good topic to cover. I've previously written a &lt;a href="http://blogs.msdn.com/johan/archive/2007/01/11/i-am-getting-outofmemoryexceptions-how-can-i-troubleshoot-this.aspx"&gt;post&lt;/a&gt; specifically targeting OutOfMemoryExceptions, but I thought I should broaden the terms and make it a bit more general. There are two scenarios that are exceptionally common in my line of work:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Clients are reporting 2nd chance exceptions displayed on screen with the classic "Server Error"- page.  &lt;li&gt;Performance is generally bad, and when we investigate it turns out that there are tons of exceptions being thrown every second.&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;In this post I'll cover how to investigate what exceptions have been thrown by an application, as well as how to use windbg and adplus to automatically gather specific information for us.&lt;/p&gt; &lt;h1&gt;Where to start&lt;/h1&gt; &lt;p&gt;Okay, so you have a web application that you've been monitoring and you believe it is throwing a lot of exceptions. You've taken a dump of the process and you're ready to begin the investigation. Where do you start?&lt;/p&gt; &lt;h2&gt;!dumpallexceptions (!dae)&lt;/h2&gt; &lt;p&gt;If your application is running under the .NET Framework 1.1 you can use the !dumpallexceptions-command (!dae) to get a list of all the exceptions still on the heap. Now, remember that an exception is a managed object, so they will eventually be garbage collected just like everything else. This means that when looking at the heap for exceptions you will only get the exceptions still in memory, not every exception thrown by the application since startup.&lt;/p&gt; &lt;p&gt;Anyway, if you run !dae you'll get a list of exceptions that looks like this:&lt;/p&gt; &lt;div class="DebugSample"&gt;0:000&amp;gt; !dae&lt;br&gt;Going to dump the .NET Exceptions found in the heap.&lt;br&gt;Loading the heap objects into our cache.&lt;br&gt;Number of exceptions of this type:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&lt;br&gt;Exception object: 026200ec&lt;br&gt;Exception type: System.ExecutionEngineException&lt;br&gt;Message: &lt;none&gt;&lt;br&gt;InnerException: &lt;none&gt;&lt;br&gt;StackTrace (generated):&lt;br&gt;&lt;none&gt;&lt;br&gt;StackTraceString: &lt;none&gt;&lt;br&gt;HResult: 80131506&lt;br&gt;The current thread is unmanaged&lt;br&gt;-----------------&lt;br&gt;&lt;br&gt;Number of exceptions of this type:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&lt;br&gt;Exception object: 026200a4&lt;br&gt;Exception type: System.StackOverflowException&lt;br&gt;Message: &lt;none&gt;&lt;br&gt;InnerException: &lt;none&gt;&lt;br&gt;StackTrace (generated):&lt;br&gt;&lt;none&gt;&lt;br&gt;StackTraceString: &lt;none&gt;&lt;br&gt;HResult: 800703e9&lt;br&gt;The current thread is unmanaged&lt;br&gt;-----------------&lt;br&gt;&lt;br&gt;Number of exceptions of this type:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&lt;br&gt;Exception object: 0262005c&lt;br&gt;Exception type: System.OutOfMemoryException&lt;br&gt;Message: &lt;none&gt;&lt;br&gt;InnerException: &lt;none&gt;&lt;br&gt;StackTrace (generated):&lt;br&gt;&lt;none&gt;&lt;br&gt;StackTraceString: &lt;none&gt;&lt;br&gt;HResult: 8007000e&lt;br&gt;The current thread is unmanaged&lt;br&gt;-----------------&lt;br&gt;&lt;br&gt;Number of exceptions of this type:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&lt;br&gt;Exception object: 0b62cf38&lt;br&gt;Exception type: System.Data.SqlClient.SqlException&lt;br&gt;Message: Transaction (Process ID 96) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.&lt;br&gt;InnerException: &lt;none&gt;&lt;br&gt;StackTrace (generated):&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SP&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IP&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Function&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1DACECA8 1D0A4D4C Company.Database.AuditTrail.Write(System.String, System.Guid, System.String)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1DACED6C 1D0A4B98 Company.Database.AuditTrail.AddEntry(EntryType, System.Guid, System.String)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1DACED90 1D0A4B24 Company.Database.DataFunctions.SaveRow(System.String, System.Guid, Boolean)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1DACEE20 1DDD7A06 FooBase.PersonApplicationOtherQualificationBase.PersonApplicationOtherQualificationBaseManager.BaseSave(System.Guid, Boolean)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1DACEE34 1DDD79BF Foo.PersonApplicationOtherQualification.PersonApplicationOtherQualificationManager.Save(System.Guid, Boolean)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1DACEE48 1DDD77F5 UserControls.PersonApplicationOtherQualificationDetail.OnSave()&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1DACEE70 1DDD2701 Company.Web.UI.Page.InvokeUsercontrolTransaction(System.Web.UI.Control, Company.Web.TransactionType)&lt;br&gt;&lt;br&gt;StackTraceString: &lt;none&gt;&lt;br&gt;HResult: 80131904&lt;br&gt;The current thread is unmanaged&lt;br&gt;-----------------&lt;br&gt;&lt;br&gt;Number of exceptions of this type:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3&lt;br&gt;Exception object: 0b62d23c&lt;br&gt;Exception type: System.Exception&lt;br&gt;Message: Thrown while invoking Save on object PersonApplicationOtherQualificationDetail1(ASP.sys_modules_person_personapplicationotherqualificationdetail_ascx)&lt;br&gt;InnerException: System.Data.SqlClient.SqlException, use !PrintException 0b62cf38 to see more&lt;br&gt;StackTrace (generated):&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SP&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IP&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Function&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1DACEDF8 1DDD28C8 Company.Web.UI.Page.InvokeUsercontrolTransaction(System.Web.UI.Control, Company.Web.TransactionType)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1DACEEC4 1DDD262D Company.Web.UI.Page.InvokeUsercontrolTransaction(System.Web.UI.Control, Company.Web.TransactionType)&lt;br&gt;&lt;br&gt;StackTraceString: &lt;none&gt;&lt;br&gt;HResult: 80131500&lt;br&gt;The current thread is unmanaged&lt;br&gt;-----------------&lt;br&gt;&lt;br&gt;Number of exceptions of this type:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 8&lt;br&gt;Exception object: 03c6fbb8&lt;br&gt;Exception type: System.ArgumentNullException&lt;br&gt;Message: Value cannot be null.&lt;br&gt;InnerException: &lt;none&gt;&lt;br&gt;StackTrace (generated):&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SP&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IP&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Function&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1F15E3E0 795FC73C System.Guid..ctor(System.String)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1F15E43C 1D0AB97F Pages.PersonHomePage.Page_Load(System.Object, System.EventArgs)&lt;br&gt;&lt;br&gt;StackTraceString: &lt;none&gt;&lt;br&gt;HResult: 80004003&lt;br&gt;The current thread is unmanaged&lt;br&gt;-----------------&lt;br&gt;&lt;br&gt;Number of exceptions of this type:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 36&lt;br&gt;Exception object: 02620134&lt;br&gt;Exception type: System.Threading.ThreadAbortException&lt;br&gt;Message: &lt;none&gt;&lt;br&gt;InnerException: &lt;none&gt;&lt;br&gt;StackTrace (generated):&lt;br&gt;&lt;none&gt;&lt;br&gt;StackTraceString: &lt;none&gt;&lt;br&gt;HResult: 80131530&lt;br&gt;The current thread is unmanaged&lt;br&gt;-----------------&lt;br&gt;&lt;br&gt;Number of exceptions of this type:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 116&lt;br&gt;Exception object: 0396692c&lt;br&gt;Exception type: System.Web.HttpUnhandledException&lt;br&gt;Message: &lt;none&gt;&lt;br&gt;InnerException: System.NullReferenceException, use !PrintException 03966878 to see more&lt;br&gt;StackTrace (generated):&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SP&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IP&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Function&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1CE6DF58 6614FDB2 System.Web.UI.Page.HandleError(System.Exception)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1CE6DFA0 6615681A System.Web.UI.Page.ProcessRequestMain(Boolean, Boolean)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1CE6EF10 66154A8A System.Web.UI.Page.ProcessRequest(Boolean, Boolean)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1CE6EF48 66154967 System.Web.UI.Page.ProcessRequest()&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1CE6EF80 66154887 System.Web.UI.Page.ProcessRequestWithNoAssert(System.Web.HttpContext)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1CE6EF88 6615481A System.Web.UI.Page.ProcessRequest(System.Web.HttpContext)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1CE6EF9C 1C741EAE ASP.sys_pages_application_application_aspx.ProcessRequest(System.Web.HttpContext)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1CE6EFA8 65FF27D4 System.Web.HttpApplication+CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1CE6EFDC 65FC15B5 System.Web.HttpApplication.ExecuteStep(IExecutionStep, Boolean ByRef)&lt;br&gt;&lt;br&gt;StackTraceString: &lt;none&gt;&lt;br&gt;HResult: 80004005&lt;br&gt;The current thread is unmanaged&lt;br&gt;-----------------&lt;br&gt;&lt;br&gt;Number of exceptions of this type:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 136&lt;br&gt;Exception object: 03966878&lt;br&gt;Exception type: System.NullReferenceException&lt;br&gt;Message: Object reference not set to an instance of an object.&lt;br&gt;InnerException: &lt;none&gt;&lt;br&gt;StackTrace (generated):&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SP&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IP&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Function&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1CE6EC2C 1C745B38 Pages.Application.Page_Load(System.Object, System.EventArgs)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 00000000 00000001 System.EventHandler.Invoke(System.Object, System.EventArgs)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1CE6ED34 66143A84 System.Web.UI.Control.OnLoad(System.EventArgs)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1CE6ED44 66143AD0 System.Web.UI.Control.LoadRecursive()&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1CE6ED58 66155106 System.Web.UI.Page.ProcessRequestMain(Boolean, Boolean)&lt;br&gt;&lt;br&gt;StackTraceString: &lt;none&gt;&lt;br&gt;HResult: 80004003&lt;br&gt;The current thread is unmanaged&lt;br&gt;-----------------&lt;br&gt;&lt;br&gt;Total 303 exceptions&lt;/div&gt; &lt;p&gt;As you can see the !dae-command lists all exception types found on the heap. If possible it also gives us a callstack for each exception. Please note, however, that this doesn't mean that the call stack is more or less the same for &lt;em&gt;all&lt;/em&gt; exceptions. In the sample above you might have ~20 different callstacks leading to the 136 NullReferenceExceptions you see.&lt;/p&gt; &lt;p&gt;Unfortunately the !dae command is not available in version 2.0 of sos.dll. Still, it's quite easy to get (more or less) the same result by using the !dumpheap command. If we just type &lt;span class="InlineCode"&gt;"!dumpheap -type Exception"&lt;/span&gt; we'll get a list of all objects with the string "Exception" in their class name. This is almost as good.&lt;/p&gt; &lt;div class="DebugSample"&gt;0:000&amp;gt; !dumpheap -type Exception -stat&lt;br&gt;------------------------------&lt;br&gt;Heap 0&lt;br&gt;total 79 objects&lt;br&gt;------------------------------&lt;br&gt;Heap 1&lt;br&gt;total 76 objects&lt;br&gt;------------------------------&lt;br&gt;Heap 2&lt;br&gt;total 91 objects&lt;br&gt;------------------------------&lt;br&gt;Heap 3&lt;br&gt;total 92 objects&lt;br&gt;------------------------------&lt;br&gt;total 338 objects&lt;br&gt;Statistics:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MT&amp;nbsp;&amp;nbsp;&amp;nbsp; Count&amp;nbsp;&amp;nbsp;&amp;nbsp; TotalSize Class Name&lt;br&gt;790ff624&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 36 System.Text.DecoderExceptionFallback&lt;br&gt;790ff5d8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 36 System.Text.EncoderExceptionFallback&lt;br&gt;790f9ad4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 72 System.ExecutionEngineException&lt;br&gt;790f9a30&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 72 System.StackOverflowException&lt;br&gt;790f998c&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 72 System.OutOfMemoryException&lt;br&gt;653c8d04&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 76 System.Data.SqlClient.SqlException&lt;br&gt;790f984c&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 216 System.Exception&lt;br&gt;66414de0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 18&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 216 System.Web.HttpApplication+CancelModuleException&lt;br&gt;7911bc7c&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 11&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 352 System.UnhandledExceptionEventHandler&lt;br&gt;7911a3b0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 608 System.ArgumentNullException&lt;br&gt;790f9b78&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 36&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2592 System.Threading.ThreadAbortException&lt;br&gt;663d9268&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 116&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 9744 System.Web.HttpUnhandledException&lt;br&gt;7915cf40&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 136&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 9792 System.NullReferenceException&lt;br&gt;Total 338 objects&lt;/div&gt; &lt;p&gt;As you can see, this gives us almost the same information except for the callstacks.&lt;/p&gt; &lt;h2&gt;&lt;/h2&gt; &lt;h1&gt;Knowing what to ignore&lt;/h1&gt; &lt;p&gt;When analyzing data it is always good to know how to filter the information.&lt;/p&gt; &lt;h2&gt;The ever-present exceptions&lt;/h2&gt; &lt;p&gt;There are a three exceptions that are created as soon as the worker process starts. This means that you will &lt;em&gt;always &lt;/em&gt;see them on the heap even if they haven't been thrown at all.:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;System.ExecutionEngineException  &lt;li&gt;System.StackOverflowException  &lt;li&gt;System.OutOfMemoryException&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;So why are they created if we haven't thrown them? - Any guesses?&lt;/p&gt; &lt;p&gt;The answer is quite simple: If you run into a situation where you need to throw any of these exceptions you will probably be in a state where you can't create them. For example, you've run out of memory and are no longer able to allocate even the tiniest string. How would you then be able to allocate enough memory to create a new exception?&lt;/p&gt; &lt;p&gt;So, provided that there's&amp;nbsp;still only one of each on the heap, you can most likely ignore these three exceptions. When it comes to ExecutionEngineExceptions and OutOfMemoryExceptions you will probably have a pretty good idea that this is what you're looking for, and finding a StackOverflowException isn't that hard. If you run !clrstack and find a callstack of 200+ lines you can be more or less certain that this is your problem.&lt;/p&gt; &lt;h2&gt;System.Threading.ThreadAbortException&lt;/h2&gt; &lt;p&gt;Usually when you see a&amp;nbsp;ThreadAbortExceptions it is because you've called Response.Redirect.&lt;/p&gt; &lt;p&gt;Whenever you call Response.Redirect, this will also result in a call to Response.End. This will terminate the thread prematurely, resulting in a System.Threading.ThreadAbortException. See the callstack below for an example.&lt;/p&gt; &lt;div class="DebugSample"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SP&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IP&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Function&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1ED6F37C 793D74D0 mscorlib_ni!System.Threading.Thread.Abort(System.Object)+0x2c&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1ED6F390 6600CA8C System_Web_ni!System.Web.HttpResponse.End()+0x5c&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1ED6F3A4 6600B8C3 System_Web_ni!System.Web.HttpResponse.Redirect(System.String, Boolean)+0x1f3&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1ED6F3B8 6600B6B7 System_Web_ni!System.Web.HttpResponse.Redirect(System.String)+0x7&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1ED6F3BC 1DDD2E1D Company_Web!Company.Web.UI.Page.RedirectToPreviousPage()+0x125&lt;br&gt;&lt;/div&gt; &lt;p&gt;Obviously I'm not saying you should discard &lt;em&gt;all&lt;/em&gt; System.Threading.ThreadAbortExceptions as irrelevant. Even if you have no reason to believe that ThreadAbortExceptions are a major concern it's always a good idea to investigate a few of them. Take a minute or two&amp;nbsp;to confirm that there is an underlying call to Response.End caused by a Response.Redirect. Once you think that you have enough statistical data to imply that the ThreadAbortExceptions are caused by Redirects you can move on.&lt;/p&gt; &lt;h1&gt;Examining the Exceptions&lt;/h1&gt; &lt;p&gt;Okay, so say we want to look at the callstacks for the System.Data.SqlClient.SqlException, well first of all we need the address for it. As you might remember, this is easily obtained by using !dumpheap without the -stat option.&lt;/p&gt; &lt;div class="DebugSample"&gt;0:000&amp;gt; !dumpheap -type System.Data.SqlClient.SqlException&lt;br&gt;------------------------------&lt;br&gt;Heap 0&lt;br&gt;Address&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Size&lt;br&gt;total 0 objects&lt;br&gt;------------------------------&lt;br&gt;Heap 1&lt;br&gt;Address&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Size&lt;br&gt;total 0 objects&lt;br&gt;------------------------------&lt;br&gt;Heap 2&lt;br&gt;Address&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Size&lt;br&gt;&lt;font color="#ff0000"&gt;0b62cf38&lt;/font&gt; 653c8d04&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 76&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;total 1 objects&lt;br&gt;------------------------------&lt;br&gt;Heap 3&lt;br&gt;Address&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Size&lt;br&gt;total 0 objects&lt;br&gt;------------------------------&lt;br&gt;total 1 objects&lt;br&gt;Statistics:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MT&amp;nbsp;&amp;nbsp;&amp;nbsp; Count&amp;nbsp;&amp;nbsp;&amp;nbsp; TotalSize Class Name&lt;br&gt;653c8d04&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 76 System.Data.SqlClient.SqlException&lt;br&gt;Total 1 objects&lt;br&gt;&lt;/div&gt; &lt;p&gt;Now we have the address for the exception. In order to investigate the exception we &lt;em&gt;could &lt;/em&gt;use !dumpobject, but there is another command I want to use first.&lt;/p&gt; &lt;h2&gt;!printexception (!pe)&lt;/h2&gt; &lt;p&gt;Running the !printexception command on the address of an exception will give us some neat information on the exception in question. Here's the result of running !printexception on the SqlException:&lt;/p&gt; &lt;div class="DebugSample"&gt;0:000&amp;gt; !pe 0b62cf38 &lt;br&gt;Exception object: 0b62cf38&lt;br&gt;Exception type: System.Data.SqlClient.SqlException&lt;br&gt;Message: Transaction (Process ID 96) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.&lt;br&gt;InnerException: &lt;none&gt;&lt;br&gt;StackTrace (generated):&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SP&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IP&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Function&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1DACECA8 1D0A4D4C Company_Database_1d3c0000!Company.Database.AuditTrail.Write(System.String, System.Guid, System.String)+0x194&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1DACED6C 1D0A4B98 Company_Database_1d3c0000!Company.Database.AuditTrail.AddEntry(EntryType, System.Guid, System.String)+0x48&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1DACED90 1D0A4B24 Company_Database_1d3c0000!Company.Database.DataFunctions.SaveRow(System.String, System.Guid, Boolean)+0x5e4&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1DACEE20 1DDD7A06 FooBase_1d560000!FooBase.PersonApplicationOtherQualificationBase.PersonApplicationOtherQualificationBaseManager.BaseSave(System.Guid, Boolean)+0x2e&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1DACEE34 1DDD79BF Foo_1cfd0000!Foo.PersonApplicationOtherQualification.PersonApplicationOtherQualificationManager.Save(System.Guid, Boolean)+0x27&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1DACEE48 1DDD77F5 Foo_1cfd0000!UserControls.PersonApplicationOtherQualificationDetail.OnSave()+0x65&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1DACEE70 1DDD2701 Company_Web_1d090000!Company.Web.UI.Page.InvokeUsercontrolTransaction(System.Web.UI.Control, Company.Web.TransactionType)+0x1d1&lt;br&gt;&lt;br&gt;StackTraceString: &lt;none&gt;&lt;br&gt;HResult: 80131904&lt;br&gt;The current thread is unmanaged&lt;br&gt;&lt;/div&gt; &lt;p&gt;This is good stuff. The command was even able to generate a callstack for us.&amp;nbsp;(This may not always be the case, since the callstack may very well have gone out of scope.) &lt;/p&gt; &lt;h2&gt;!dumpobject (!do) still has its uses&lt;/h2&gt; &lt;p&gt;I wouldn't say that !printexception is a complete replacement for !dumpobject when it comes to examining exceptions. !Printexception will fit the exception into a standard template, and since some exceptions may contain more data than others we sometimes want to use !dumpobject as well. The SqlException has a property called _errors that contains a System.Data.SqlClient.SqlErrorCollection that we might want to look at. This is not in the listing above, so we need to use !dumpobject to look at it.&lt;/p&gt; &lt;div class="DebugSample"&gt;0:000&amp;gt; !do 0b62cf38 &lt;br&gt;Name: System.Data.SqlClient.SqlException&lt;br&gt;MethodTable: 653c8d04&lt;br&gt;EEClass: 6540a0d0&lt;br&gt;Size: 76(0x4c) bytes&lt;br&gt;(C:\WINDOWS\assembly\GAC_32\System.Data\2.0.0.0__b77a5c561934e089\System.Data.dll)&lt;br&gt;Fields:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MT&amp;nbsp;&amp;nbsp;&amp;nbsp; Field&amp;nbsp;&amp;nbsp; Offset&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Type VT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Attr&amp;nbsp;&amp;nbsp;&amp;nbsp; Value Name&lt;br&gt;790f9244&amp;nbsp; 40000b5&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.String&amp;nbsp; 0 instance 00000000 _className&lt;br&gt;79107d4c&amp;nbsp; 40000b6&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 8 ...ection.MethodBase&amp;nbsp; 0 instance 00000000 _exceptionMethod&lt;br&gt;790f9244&amp;nbsp; 40000b7&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; c&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.String&amp;nbsp; 0 instance 00000000 _exceptionMethodString&lt;br&gt;790f9244&amp;nbsp; 40000b8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 10&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.String&amp;nbsp; 0 instance 0b62cdfc _message&lt;br&gt;79112734&amp;nbsp; 40000b9&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 14 ...tions.IDictionary&amp;nbsp; 0 instance 0b62cf84 _data&lt;br&gt;790f984c&amp;nbsp; 40000ba&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 18&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Exception&amp;nbsp; 0 instance 00000000 _innerException&lt;br&gt;790f9244&amp;nbsp; 40000bb&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1c&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.String&amp;nbsp; 0 instance 00000000 _helpURL&lt;br&gt;790f8a7c&amp;nbsp; 40000bc&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 20&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Object&amp;nbsp; 0 instance 0b62d030 _stackTrace&lt;br&gt;790f9244&amp;nbsp; 40000bd&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 24&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.String&amp;nbsp; 0 instance 00000000 _stackTraceString&lt;br&gt;790f9244&amp;nbsp; 40000be&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 28&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.String&amp;nbsp; 0 instance 00000000 _remoteStackTraceString&lt;br&gt;790fdb60&amp;nbsp; 40000bf&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 34&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Int32&amp;nbsp; 1 instance&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 _remoteStackIndex&lt;br&gt;790f8a7c&amp;nbsp; 40000c0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2c&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Object&amp;nbsp; 0 instance 00000000 _dynamicMethods&lt;br&gt;790fdb60&amp;nbsp; 40000c1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 38&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Int32&amp;nbsp; 1 instance -2146232060 _HResult&lt;br&gt;790f9244&amp;nbsp; 40000c2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 30&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.String&amp;nbsp; 0 instance 00000000 _source&lt;br&gt;790fcfa4&amp;nbsp; 40000c3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3c&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.IntPtr&amp;nbsp; 1 instance&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 _xptrs&lt;br&gt;790fdb60&amp;nbsp; 40000c4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 40&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Int32&amp;nbsp; 1 instance -532459699 _xcode&lt;br&gt;653c8b28&amp;nbsp; 40017e0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 44 ...qlErrorCollection&amp;nbsp; 0 instance &lt;font color="#ff0000"&gt;0b62cd90&lt;/font&gt; _errors&lt;br&gt;&lt;/div&gt; &lt;p&gt;There we have it. Now we can continue&amp;nbsp;using !dumpobject to investigate it even further if we wish.&lt;/p&gt; &lt;h2&gt;Inner exceptions&lt;/h2&gt; &lt;p&gt;If we take a look at one of the HttpUnhandledExceptions we find that it has an inner exception. It is even nice enough to let us know how to find out more about it.&lt;/p&gt; &lt;div class="DebugSample"&gt;0:000&amp;gt; !pe 10544f64 &lt;br&gt;Exception object: 10544f64&lt;br&gt;Exception type: System.Web.HttpUnhandledException&lt;br&gt;Message: &lt;none&gt;&lt;br&gt;&lt;font color="#ff0000"&gt;InnerException: System.NullReferenceException, use !PrintException 10544df8 to see more&lt;/font&gt;&lt;br&gt;StackTrace (generated):&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SP&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IP&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Function&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1E3BE1D8 6614FDB2 System_Web_ni!System.Web.UI.Page.HandleError(System.Exception)+0x3e6&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1E3BE220 6615681A System_Web_ni!System.Web.UI.Page.ProcessRequestMain(Boolean, Boolean)+0x1b3a&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1E3BF190 66154A8A System_Web_ni!System.Web.UI.Page.ProcessRequest(Boolean, Boolean)+0xd6&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1E3BF1C8 66154967 System_Web_ni!System.Web.UI.Page.ProcessRequest()+0x57&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1E3BF200 66154887 System_Web_ni!System.Web.UI.Page.ProcessRequestWithNoAssert(System.Web.HttpContext)+0x13&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1E3BF208 6615481A System_Web_ni!System.Web.UI.Page.ProcessRequest(System.Web.HttpContext)+0x32&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1E3BF21C 1C741EAE App_Web__ekpvebx!ASP.sys_pages_application_application_aspx.ProcessRequest(System.Web.HttpContext)+0x1e&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1E3BF228 65FF27D4 System_Web_ni!System.Web.HttpApplication+CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()+0x130&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1E3BF25C 65FC15B5 System_Web_ni!System.Web.HttpApplication.ExecuteStep(IExecutionStep, Boolean ByRef)+0x41&lt;/div&gt; &lt;p&gt;This means that the System.NullReferenceException mentioned lead to the HttpUnhandledException we're currently investigating. So if we want to find the root cause we'll need to investigate the inner exception as well.&lt;/p&gt; &lt;h1&gt;Extra credit&lt;/h1&gt; &lt;p&gt;If you've looked at my "&lt;a href="http://blogs.msdn.com/johan/archive/2008/01/23/using-windbg-advanced-commands.aspx"&gt;Advanced commands&lt;/a&gt;"-post a while back you saw some examples of the .foreach command. This is a great command to use, for example if you want to see the callstack for all System.ArgumentNullExceptions. Instead of manually iterating through all the exceptions we can now dump them all at once, check their callstacks, etc.&lt;/p&gt; &lt;div class="DebugSample"&gt;0:000&amp;gt; .foreach(myVariable {!dumpheap -type System.ArgumentNullException -short}){!pe myVariable;.echo *************}&lt;br&gt;Exception object: 03c6fbb8&lt;br&gt;Exception type: System.ArgumentNullException&lt;br&gt;Message: Value cannot be null.&lt;br&gt;InnerException: &lt;none&gt;&lt;br&gt;StackTrace (generated):&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SP&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IP&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Function&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1F15E3E0 795FC73C mscorlib_ni!System.Guid..ctor(System.String)+0x2a14bc&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1F15E43C 1D0AB97F Foo_1cfd0000!Pages.PersonHomePage.Page_Load(System.Object, System.EventArgs)+0x77&lt;br&gt;&lt;br&gt;StackTraceString: &lt;none&gt;&lt;br&gt;HResult: 80004003&lt;br&gt;The current thread is unmanaged&lt;br&gt;*************&lt;br&gt;Exception object: 08378e24&lt;br&gt;Exception type: System.ArgumentNullException&lt;br&gt;Message: Value cannot be null.&lt;br&gt;InnerException: &lt;none&gt;&lt;br&gt;StackTrace (generated):&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SP&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IP&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Function&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1CE6EC60 795FC73C mscorlib_ni!System.Guid..ctor(System.String)+0x2a14bc&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1CE6ECBC 1D0AB97F Foo_1cfd0000!Pages.PersonHomePage.Page_Load(System.Object, System.EventArgs)+0x77&lt;br&gt;&lt;br&gt;StackTraceString: &lt;none&gt;&lt;br&gt;HResult: 80004003&lt;br&gt;The current thread is unmanaged&lt;br&gt;*************&lt;br&gt;Exception object: 084c0b30&lt;br&gt;Exception type: System.ArgumentNullException&lt;br&gt;Message: Value cannot be null.&lt;br&gt;InnerException: &lt;none&gt;&lt;br&gt;StackTrace (generated):&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SP&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IP&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Function&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1E3BEEE0 795FC73C mscorlib_ni!System.Guid..ctor(System.String)+0x2a14bc&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1E3BEF3C 1D0AB97F Foo_1cfd0000!Pages.PersonHomePage.Page_Load(System.Object, System.EventArgs)+0x77&lt;br&gt;&lt;br&gt;StackTraceString: &lt;none&gt;&lt;br&gt;HResult: 80004003&lt;br&gt;The current thread is unmanaged&lt;br&gt;*************&lt;br&gt;Exception object: 08522f84&lt;br&gt;Exception type: System.ArgumentNullException&lt;br&gt;Message: Value cannot be null.&lt;br&gt;InnerException: &lt;none&gt;&lt;br&gt;StackTrace (generated):&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SP&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IP&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Function&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1E3BEEE0 795FC73C mscorlib_ni!System.Guid..ctor(System.String)+0x2a14bc&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1E3BEF3C 1D0AB97F Foo_1cfd0000!Pages.PersonHomePage.Page_Load(System.Object, System.EventArgs)+0x77&lt;br&gt;&lt;br&gt;StackTraceString: &lt;none&gt;&lt;br&gt;HResult: 80004003&lt;br&gt;The current thread is unmanaged&lt;br&gt;*************&lt;br&gt;Exception object: 0c036bf8&lt;br&gt;Exception type: System.ArgumentNullException&lt;br&gt;Message: Value cannot be null.&lt;br&gt;InnerException: &lt;none&gt;&lt;br&gt;StackTrace (generated):&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SP&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IP&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Function&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1DC7EB60 795FC73C mscorlib_ni!System.Guid..ctor(System.String)+0x2a14bc&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1DC7EBBC 1D0AB97F Foo_1cfd0000!Pages.PersonHomePage.Page_Load(System.Object, System.EventArgs)+0x77&lt;br&gt;&lt;br&gt;StackTraceString: &lt;none&gt;&lt;br&gt;HResult: 80004003&lt;br&gt;The current thread is unmanaged&lt;br&gt;*************&lt;br&gt;Exception object: 105d7f60&lt;br&gt;Exception type: System.ArgumentNullException&lt;br&gt;Message: Value cannot be null.&lt;br&gt;InnerException: &lt;none&gt;&lt;br&gt;StackTrace (generated):&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SP&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IP&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Function&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1F39F360 795FC73C mscorlib_ni!System.Guid..ctor(System.String)+0x2a14bc&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1F39F3BC 1D0AB97F Foo_1cfd0000!Pages.PersonHomePage.Page_Load(System.Object, System.EventArgs)+0x77&lt;br&gt;&lt;br&gt;StackTraceString: &lt;none&gt;&lt;br&gt;HResult: 80004003&lt;br&gt;The current thread is unmanaged&lt;br&gt;*************&lt;br&gt;Exception object: 106206fc&lt;br&gt;Exception type: System.ArgumentNullException&lt;br&gt;Message: Value cannot be null.&lt;br&gt;InnerException: &lt;none&gt;&lt;br&gt;StackTrace (generated):&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SP&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IP&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Function&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1F39F360 795FC73C mscorlib_ni!System.Guid..ctor(System.String)+0x2a14bc&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1F39F3BC 1D0AB97F Foo_1cfd0000!Pages.PersonHomePage.Page_Load(System.Object, System.EventArgs)+0x77&lt;br&gt;&lt;br&gt;StackTraceString: &lt;none&gt;&lt;br&gt;HResult: 80004003&lt;br&gt;The current thread is unmanaged&lt;br&gt;*************&lt;br&gt;Exception object: 1077a864&lt;br&gt;Exception type: System.ArgumentNullException&lt;br&gt;Message: Value cannot be null.&lt;br&gt;InnerException: &lt;none&gt;&lt;br&gt;StackTrace (generated):&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SP&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IP&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Function&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1E3BEEE0 795FC73C mscorlib_ni!System.Guid..ctor(System.String)+0x2a14bc&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1E3BEF3C 1D0AB97F Foo_1cfd0000!Pages.PersonHomePage.Page_Load(System.Object, System.EventArgs)+0x77&lt;br&gt;&lt;br&gt;StackTraceString: &lt;none&gt;&lt;br&gt;HResult: 80004003&lt;br&gt;The current thread is unmanaged&lt;br&gt;*************&lt;br&gt;Unknown option: ------------------------------&lt;br&gt;*************&lt;br&gt;&lt;/div&gt; &lt;p&gt;Well this post was even longer than usual.&lt;/p&gt; &lt;p&gt;I hope you found it of value, and I'll gladly listen to any comments, feedback or wishes on future topics you might have.&lt;/p&gt; &lt;p&gt;/ Johan&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=7353486" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/johan/archive/tags/WinDbg/default.aspx">WinDbg</category><category domain="http://blogs.msdn.com/johan/archive/tags/Exceptions/default.aspx">Exceptions</category><category domain="http://blogs.msdn.com/johan/archive/tags/Debugging+School/default.aspx">Debugging School</category><category domain="http://blogs.msdn.com/johan/archive/tags/ASP.NET/default.aspx">ASP.NET</category></item><item><title>Using WinDbg - Advanced commands</title><link>http://blogs.msdn.com/johan/archive/2008/01/23/using-windbg-advanced-commands.aspx</link><pubDate>Wed, 23 Jan 2008 17:46:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:7209127</guid><dc:creator>JohanS</dc:creator><slash:comments>9</slash:comments><comments>http://blogs.msdn.com/johan/comments/7209127.aspx</comments><wfw:commentRss>http://blogs.msdn.com/johan/commentrss.aspx?PostID=7209127</wfw:commentRss><description>&lt;p&gt;Did you know you can build your own advanced commands using for each, if, etc? The complete list of control tokens are:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;.if  &lt;li&gt;.else  &lt;li&gt;.elseif  &lt;li&gt;.foreach  &lt;li&gt;.for  &lt;li&gt;.while  &lt;li&gt;.do  &lt;li&gt;.break  &lt;li&gt;.continue  &lt;li&gt;.catch  &lt;li&gt;.leave  &lt;li&gt;.printf  &lt;li&gt;.block&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Using these command tokes you can send quite advanced instructions to the debugger that not only will make your job a lot easier, but also impress your manager immensely. :)&lt;/p&gt; &lt;h1&gt;.foreach&lt;/h1&gt; &lt;p&gt;Let's begin with an easy example. Imagine you want to investigate all strings on the heap that are 6500 bytes or more. To list them you'd simply type &lt;span class="InlineCode"&gt;!dumpheap -type System.String -min 6500&lt;/span&gt;. This will give you the following information:&lt;/p&gt; &lt;div class="DebugSample"&gt;0:000&amp;gt; !dumpheap -type System.String -min 6500&lt;br&gt;------------------------------&lt;br&gt;Heap 0&lt;br&gt;Address&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Size&lt;br&gt;790da154 790f9244&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 9280&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;0264c4d0 790f9244&amp;nbsp;&amp;nbsp;&amp;nbsp; 32788&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;total 2 objects&lt;br&gt;------------------------------&lt;br&gt;Heap 1&lt;br&gt;Address&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Size&lt;br&gt;total 0 objects&lt;br&gt;------------------------------&lt;br&gt;Heap 2&lt;br&gt;Address&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Size&lt;br&gt;0b62e790 790f9244&amp;nbsp;&amp;nbsp;&amp;nbsp; 11284&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;total 1 objects&lt;br&gt;------------------------------&lt;br&gt;Heap 3&lt;br&gt;Address&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Size&lt;br&gt;0e6839d0 790f9244&amp;nbsp;&amp;nbsp;&amp;nbsp; 32788&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;0e717904 790f9244&amp;nbsp;&amp;nbsp;&amp;nbsp; 32788&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;0fb2a320 790f9244&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 6828&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;total 3 objects&lt;br&gt;------------------------------&lt;br&gt;total 6 objects&lt;br&gt;Statistics:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MT&amp;nbsp;&amp;nbsp;&amp;nbsp; Count&amp;nbsp;&amp;nbsp;&amp;nbsp; TotalSize Class Name&lt;br&gt;790f9244&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 6&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 125756 System.String&lt;br&gt;Total 6 objects&lt;/div&gt; &lt;p&gt;So far, so good. The problem is that in order to investigate each string you'd have to run !dumpobject (!do) on every address. This might be acceptable now that we're only dealing with 6 strings, but what if it were 25, or 100? I don't know if you're aware of this, but if you pass the -short argument to !dumpheap it will give you the minimum information (just the addresses of the objects in question):&lt;/p&gt; &lt;div class="DebugSample"&gt;0:000&amp;gt; !dumpheap -type System.String -min 6500 &lt;font color="#ff0000"&gt;-short&lt;/font&gt;&lt;br&gt;790da154 &lt;br&gt;0264c4d0 &lt;br&gt;0b62e790 &lt;br&gt;0e6839d0 &lt;br&gt;0e717904 &lt;br&gt;0fb2a320 &lt;br&gt;------------------------------&lt;/div&gt; &lt;p&gt;Now, let's use this information in a .foreach-clause:&lt;/p&gt; &lt;div class="DebugSample"&gt;0:000&amp;gt; .foreach(myVariable {!dumpheap -type System.String -min 6500 -short}){!do myVariable;.echo *************}&lt;br&gt;Name: System.String&lt;br&gt;MethodTable: 790f9244&lt;br&gt;EEClass: 790f91a4&lt;br&gt;Size: 9280(0x2440) bytes&lt;br&gt;(C:\WINDOWS\assembly\GAC_32\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll)&lt;br&gt;String: &lt;br&gt;&lt;font color="#ff0000"&gt;WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWGRkAiEPDxYCHwEFZFhYWFhYWFhYWFhYWFhYWFhYWFhYWF&lt;br&gt;hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhY&lt;br&gt;WFhYWFhYWFhYWFhkZAInDw8WCh8CBQFFHwMFCjIyLzExLzIwMDcfBAUBVh8FBQFFHwYFASpkZAIpD2QWBGYPZBYEAg&lt;br&gt;ETC...&lt;/font&gt;&lt;br&gt;&lt;br&gt;Fields:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MT&amp;nbsp;&amp;nbsp;&amp;nbsp; Field&amp;nbsp;&amp;nbsp; Offset&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Type VT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Attr&amp;nbsp;&amp;nbsp;&amp;nbsp; Value Name&lt;br&gt;790fdb60&amp;nbsp; 4000096&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Int32&amp;nbsp; 1 instance&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4632 m_arrayLength&lt;br&gt;790fdb60&amp;nbsp; 4000097&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Int32&amp;nbsp; 1 instance&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4631 m_stringLength&lt;br&gt;790fad38&amp;nbsp; 4000098&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; c&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Char&amp;nbsp; 1 instance&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3c m_firstChar&lt;br&gt;790f9244&amp;nbsp; 4000099&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 10&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.String&amp;nbsp; 0&amp;nbsp;&amp;nbsp; shared&amp;nbsp;&amp;nbsp; static Empty&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;gt;&amp;gt; Domain:Value&amp;nbsp; 000d5eb8:790d57b4 000fb4c0:790d57b4 000ca848:790d57b4 1d8334d8:790d57b4 &amp;lt;&amp;lt;&lt;br&gt;79122994&amp;nbsp; 400009a&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 14&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Char[]&amp;nbsp; 0&amp;nbsp;&amp;nbsp; shared&amp;nbsp;&amp;nbsp; static WhitespaceChars&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;gt;&amp;gt; Domain:Value&amp;nbsp; 000d5eb8:026203f0 000fb4c0:02624504 000ca848:026745f0 1d8334d8:026dcef4 &amp;lt;&amp;lt;&lt;br&gt;*************&lt;br&gt;Name: System.String&lt;br&gt;MethodTable: 790f9244&lt;br&gt;EEClass: 790f91a4&lt;br&gt;Size: 32786(0x8012) bytes&lt;br&gt;(C:\WINDOWS\assembly\GAC_32\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll)&lt;br&gt;String: &lt;br&gt;&lt;font color="#ff0000"&gt;g8PFgIfAQUHYWFhYWFhYWRkAgMPDxYCHwEFCWFhYWFhYWFhYWRkAgQPDxYCHwEFCjI4LzEyLzIwMDdkZAIvD2QWAmY&lt;br&gt;PZBYCZg9kFgICAw8PFgIfAQUFWFhYWFhkZAIxDw8WAh8JZ2QWBGYPZBYEAgEPZBYCZg9kFgQCAQ8WAh8IBQMxcHgWA&lt;br&gt;gIBDw8WAh8JaGRkAgMPZBYEAgEPDxYCHwEFCkFkZCBSZWNvcmRkZAIDDw8WAh8ABRZ+L0ltYWdlcy9UaXRsZS9OZXc&lt;br&gt;ETC...&lt;/font&gt;&lt;br&gt;&lt;br&gt;Fields:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MT&amp;nbsp;&amp;nbsp;&amp;nbsp; Field&amp;nbsp;&amp;nbsp; Offset&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Type VT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Attr&amp;nbsp;&amp;nbsp;&amp;nbsp; Value Name&lt;br&gt;790fdb60&amp;nbsp; 4000096&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Int32&amp;nbsp; 1 instance&amp;nbsp;&amp;nbsp;&amp;nbsp; 16385 m_arrayLength&lt;br&gt;790fdb60&amp;nbsp; 4000097&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Int32&amp;nbsp; 1 instance&amp;nbsp;&amp;nbsp;&amp;nbsp; 10960 m_stringLength&lt;br&gt;790fad38&amp;nbsp; 4000098&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; c&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Char&amp;nbsp; 1 instance&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3c m_firstChar&lt;br&gt;790f9244&amp;nbsp; 4000099&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 10&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.String&amp;nbsp; 0&amp;nbsp;&amp;nbsp; shared&amp;nbsp;&amp;nbsp; static Empty&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;gt;&amp;gt; Domain:Value&amp;nbsp; 000d5eb8:790d57b4 000fb4c0:790d57b4 000ca848:790d57b4 1d8334d8:790d57b4 &amp;lt;&amp;lt;&lt;br&gt;79122994&amp;nbsp; 400009a&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 14&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Char[]&amp;nbsp; 0&amp;nbsp;&amp;nbsp; shared&amp;nbsp;&amp;nbsp; static WhitespaceChars&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;gt;&amp;gt; Domain:Value&amp;nbsp; 000d5eb8:026203f0 000fb4c0:02624504 000ca848:026745f0 1d8334d8:026dcef4 &amp;lt;&amp;lt;&lt;br&gt;*************&lt;br&gt;Name: System.String&lt;br&gt;MethodTable: 790f9244&lt;br&gt;EEClass: 790f91a4&lt;br&gt;Size: 11282(0x2c12) bytes&lt;br&gt;(C:\WINDOWS\assembly\GAC_32\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll)&lt;br&gt;String: &lt;br&gt;&lt;font color="#ff0000"&gt;WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWGRkAiEPDxYCHwEFZFhYWFhYWFhYWFhYWFhYWFhYWFhYWFa&lt;br&gt;YWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWF&lt;br&gt;hYWFhYWFhYWFhYWFhYWFhkZAInDw8WCh8CBQFFHwMFCjIyLzExLzIwMDcfBAUBVh8FBQFFHwYFASpkZAIpD2QWBGYPZ&lt;br&gt;ETC...&lt;br&gt;&lt;/font&gt;&lt;br&gt;Fields:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MT&amp;nbsp;&amp;nbsp;&amp;nbsp; Field&amp;nbsp;&amp;nbsp; Offset&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Type VT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Attr&amp;nbsp;&amp;nbsp;&amp;nbsp; Value Name&lt;br&gt;790fdb60&amp;nbsp; 4000096&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Int32&amp;nbsp; 1 instance&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 5633 m_arrayLength&lt;br&gt;790fdb60&amp;nbsp; 4000097&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Int32&amp;nbsp; 1 instance&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3092 m_stringLength&lt;br&gt;790fad38&amp;nbsp; 4000098&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; c&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Char&amp;nbsp; 1 instance&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 5b m_firstChar&lt;br&gt;790f9244&amp;nbsp; 4000099&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 10&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.String&amp;nbsp; 0&amp;nbsp;&amp;nbsp; shared&amp;nbsp;&amp;nbsp; static Empty&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;gt;&amp;gt; Domain:Value&amp;nbsp; 000d5eb8:790d57b4 000fb4c0:790d57b4 000ca848:790d57b4 1d8334d8:790d57b4 &amp;lt;&amp;lt;&lt;br&gt;79122994&amp;nbsp; 400009a&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 14&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Char[]&amp;nbsp; 0&amp;nbsp;&amp;nbsp; shared&amp;nbsp;&amp;nbsp; static WhitespaceChars&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;gt;&amp;gt; Domain:Value&amp;nbsp; 000d5eb8:026203f0 000fb4c0:02624504 000ca848:026745f0 1d8334d8:026dcef4 &amp;lt;&amp;lt;&lt;br&gt;*************&lt;br&gt;Name: System.String&lt;br&gt;MethodTable: 790f9244&lt;br&gt;EEClass: 790f91a4&lt;br&gt;Size: 32786(0x8012) bytes&lt;br&gt;(C:\WINDOWS\assembly\GAC_32\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll)&lt;br&gt;String:&lt;br&gt;&lt;font color="#ff0000"&gt;SRU5UIFBBR0U6IDMgb2YgMTVkZAILD2QWAmYPZBYcAgcPDxYCHwEFZFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWF&lt;br&gt;hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYW&lt;br&gt;FhYWFhkZAINDw8WCh4BRQUBRR4CVFQFCjIyLzExLzIwMDceAlRWBQFWHgJURQUBRR4CVFIFASpkZAITDw8WCh8CBQFF&lt;br&gt;ETC...&lt;br&gt;&lt;/font&gt;&lt;br&gt;Fields:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MT&amp;nbsp;&amp;nbsp;&amp;nbsp; Field&amp;nbsp;&amp;nbsp; Offset&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Type VT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Attr&amp;nbsp;&amp;nbsp;&amp;nbsp; Value Name&lt;br&gt;790fdb60&amp;nbsp; 4000096&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Int32&amp;nbsp; 1 instance&amp;nbsp;&amp;nbsp;&amp;nbsp; 16385 m_arrayLength&lt;br&gt;790fdb60&amp;nbsp; 4000097&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Int32&amp;nbsp; 1 instance&amp;nbsp;&amp;nbsp;&amp;nbsp; 10960 m_stringLength&lt;br&gt;790fad38&amp;nbsp; 4000098&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; c&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Char&amp;nbsp; 1 instance&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3c m_firstChar&lt;br&gt;790f9244&amp;nbsp; 4000099&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 10&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.String&amp;nbsp; 0&amp;nbsp;&amp;nbsp; shared&amp;nbsp;&amp;nbsp; static Empty&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;gt;&amp;gt; Domain:Value&amp;nbsp; 000d5eb8:790d57b4 000fb4c0:790d57b4 000ca848:790d57b4 1d8334d8:790d57b4 &amp;lt;&amp;lt;&lt;br&gt;79122994&amp;nbsp; 400009a&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 14&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Char[]&amp;nbsp; 0&amp;nbsp;&amp;nbsp; shared&amp;nbsp;&amp;nbsp; static WhitespaceChars&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;gt;&amp;gt; Domain:Value&amp;nbsp; 000d5eb8:026203f0 000fb4c0:02624504 000ca848:026745f0 1d8334d8:026dcef4 &amp;lt;&amp;lt;&lt;br&gt;*************&lt;br&gt;Name: System.String&lt;br&gt;MethodTable: 790f9244&lt;br&gt;EEClass: 790f91a4&lt;br&gt;Size: 32786(0x8012) bytes&lt;br&gt;(C:\WINDOWS\assembly\GAC_32\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll)&lt;br&gt;String:&lt;br&gt;&lt;font color="#ff0000"&gt;0b25Ib21lBR9BcHBsaWNhdGlvbk5hdmlnYXRpb246aWJ0TG9nb3V0BTdfY3RsMDpQZXJzb25BcHBsaWNhdGlvbkRlZ3J&lt;br&gt;lZUxpc3Q6U3lzdGVtVGl0bGU6RWRpdEltYWdlBT5fY3RsMDpQZXJzb25BcHBsaWNhdGlvbkRlZ3JlZURpcGxvbWFMaXN&lt;br&gt;0OlN5c3RlbVRpdGxlOkVkaXRJbWFnZQVDX2N0bDA6UGVyc29uQXBwbGljYXRpb25PdGhlclF1YWxpZmljYXRpb25MaXN&lt;br&gt;ETC...&lt;/font&gt;&lt;br&gt;&lt;br&gt;Fields:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MT&amp;nbsp;&amp;nbsp;&amp;nbsp; Field&amp;nbsp;&amp;nbsp; Offset&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Type VT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Attr&amp;nbsp;&amp;nbsp;&amp;nbsp; Value Name&lt;br&gt;790fdb60&amp;nbsp; 4000096&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Int32&amp;nbsp; 1 instance&amp;nbsp;&amp;nbsp;&amp;nbsp; 16385 m_arrayLength&lt;br&gt;790fdb60&amp;nbsp; 4000097&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Int32&amp;nbsp; 1 instance&amp;nbsp;&amp;nbsp;&amp;nbsp; 10960 m_stringLength&lt;br&gt;790fad38&amp;nbsp; 4000098&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; c&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Char&amp;nbsp; 1 instance&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3c m_firstChar&lt;br&gt;790f9244&amp;nbsp; 4000099&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 10&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.String&amp;nbsp; 0&amp;nbsp;&amp;nbsp; shared&amp;nbsp;&amp;nbsp; static Empty&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;gt;&amp;gt; Domain:Value&amp;nbsp; 000d5eb8:790d57b4 000fb4c0:790d57b4 000ca848:790d57b4 1d8334d8:790d57b4 &amp;lt;&amp;lt;&lt;br&gt;79122994&amp;nbsp; 400009a&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 14&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Char[]&amp;nbsp; 0&amp;nbsp;&amp;nbsp; shared&amp;nbsp;&amp;nbsp; static WhitespaceChars&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;gt;&amp;gt; Domain:Value&amp;nbsp; 000d5eb8:026203f0 000fb4c0:02624504 000ca848:026745f0 1d8334d8:026dcef4 &amp;lt;&amp;lt;&lt;br&gt;*************&lt;br&gt;Name: System.String&lt;br&gt;MethodTable: 790f9244&lt;br&gt;EEClass: 790f91a4&lt;br&gt;Size: 6826(0x1aaa) bytes&lt;br&gt;(C:\WINDOWS\assembly\GAC_32\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll)&lt;br&gt;String: &lt;br&gt;&lt;font color="#ff0000"&gt;/wEPDwULLTEyMTQ5MDkyMjgPZBYCAgEPZBYGAgcPZBYEAgEPDxYCHghJbWFnZVVybAUrfi9pbWFnZXMvbmF2ZAILD2QW&lt;br&gt;aWdhdGlvbi9wYWdlcy9QYWdlMlByb2dyZXNzLmdpZmRkAgIPDxYCHgRUZXh0BRVDVVJSRU5UIFBBR0U6IDMgb2YgMTVk&lt;br&gt;ZAILD2QWAmYPZBYcAgcPDxYCHwEFZFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhY&lt;br&gt;ETC...&lt;br&gt;&lt;/font&gt;&lt;br&gt;Fields:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MT&amp;nbsp;&amp;nbsp;&amp;nbsp; Field&amp;nbsp;&amp;nbsp; Offset&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Type VT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Attr&amp;nbsp;&amp;nbsp;&amp;nbsp; Value Name&lt;br&gt;790fdb60&amp;nbsp; 4000096&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Int32&amp;nbsp; 1 instance&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3405 m_arrayLength&lt;br&gt;790fdb60&amp;nbsp; 4000097&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Int32&amp;nbsp; 1 instance&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3404 m_stringLength&lt;br&gt;790fad38&amp;nbsp; 4000098&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; c&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Char&amp;nbsp; 1 instance&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2f m_firstChar&lt;br&gt;790f9244&amp;nbsp; 4000099&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 10&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.String&amp;nbsp; 0&amp;nbsp;&amp;nbsp; shared&amp;nbsp;&amp;nbsp; static Empty&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;gt;&amp;gt; Domain:Value&amp;nbsp; 000d5eb8:790d57b4 000fb4c0:790d57b4 000ca848:790d57b4 1d8334d8:790d57b4 &amp;lt;&amp;lt;&lt;br&gt;79122994&amp;nbsp; 400009a&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 14&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Char[]&amp;nbsp; 0&amp;nbsp;&amp;nbsp; shared&amp;nbsp;&amp;nbsp; static WhitespaceChars&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;gt;&amp;gt; Domain:Value&amp;nbsp; 000d5eb8:026203f0 000fb4c0:02624504 000ca848:026745f0 1d8334d8:026dcef4 &amp;lt;&amp;lt;&lt;br&gt;*************&lt;br&gt;Unknown option: ------------------------------&lt;br&gt;*************&lt;br&gt;&lt;/div&gt; &lt;p&gt;Let's analyze the exact syntax. Here's the command&lt;/p&gt;&lt;span class="InlineCode"&gt;.foreach(myVariable {!dumpheap -type System.String -min 6500 -short}){!do myVariable;.echo *************}&lt;/span&gt;  &lt;p&gt;"myVariable"&amp;nbsp;is, as the&amp;nbsp;name implies, the name of the variable that I wish to&amp;nbsp;use&amp;nbsp;for the data generated by the first set of commands. The second set of commands is&amp;nbsp;what I wish to execute for each token. First I run !do on the variable, and then I use the .echo-command to print a separator in order to make it a bit easier on the eyes.&lt;/p&gt; &lt;p&gt;There are additional parameters you can use. For example you can choose to skip every &lt;em&gt;n&lt;/em&gt; number of variables, or specify a text file to be parsed&amp;nbsp;and used as tokens instead. Take a look at the windbg documentation if you're interested.&lt;/p&gt; &lt;h1&gt;.shell&lt;/h1&gt; &lt;p&gt;I first saw this being used by my colleague &lt;a href="http://blogs.msdn.com/dougste/"&gt;Doug Stewart&lt;/a&gt;, who is a genius with these things.&lt;/p&gt; &lt;div class="DebugSample"&gt;0:000&amp;gt; .shell -i - -ci "!iisinfo.clientconns" FIND /c "Request active"&lt;br&gt;40&lt;br&gt;.shell: Process exited&lt;/div&gt; &lt;p&gt;What it does is, it runs !iisinfo.clientonns and uses the MS-DOS FIND-command to count the number of times the string "Request active" appears. Off course you could use it to search for certain strings from any type of output, like "&lt;span class="InlineCode"&gt;.shell -i - -ci "!do 0b62e790" FIND /c /i "&amp;lt;table"&lt;/span&gt;" or whatever suits your needs.  &lt;p&gt;Let's take a quick look at the syntax.  &lt;p&gt;When it comes to ".shell" the -i option is mandatory. It specifies the file we want to use for input. In this scenario we don't want to use a file, so we add another hyphen, resulting in the following syntax: "&lt;span class="InlineCode"&gt;.shell &lt;font color="#ff0000"&gt;-i -&lt;/font&gt;&lt;/span&gt;"  &lt;p&gt;We then add the -ci&amp;nbsp; option, which states that we should treat the following commands as an input file instead. "&lt;span class="InlineCode"&gt;.shell -i - &lt;font color="#ff0000"&gt;-ci "!iisinfo.clientconns"&lt;/font&gt;&lt;/span&gt;"  &lt;p&gt;Finally we state what shell command we wish to run using this input. "&lt;span class="InlineCode"&gt;.shell -i - -ci "!iisinfo.clientconns" &lt;font color="#ff0000"&gt;FIND /c "Request active"&lt;/font&gt;&lt;/span&gt;".  &lt;p&gt;&lt;/p&gt; &lt;p&gt;Naturally we can use any complicated command we wish in the statement, so instead of !iisinfo.clientconns we could run&amp;nbsp;one of our .foreach-loops instead.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;/ Johan&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=7209127" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/johan/archive/tags/WinDbg/default.aspx">WinDbg</category><category domain="http://blogs.msdn.com/johan/archive/tags/Debugging+School/default.aspx">Debugging School</category><category domain="http://blogs.msdn.com/johan/archive/tags/ASP.NET/default.aspx">ASP.NET</category></item><item><title>Getting started with windbg - part II</title><link>http://blogs.msdn.com/johan/archive/2007/11/26/getting-started-with-windbg-part-ii.aspx</link><pubDate>Mon, 26 Nov 2007 16:49:50 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:6531187</guid><dc:creator>JohanS</dc:creator><slash:comments>12</slash:comments><comments>http://blogs.msdn.com/johan/comments/6531187.aspx</comments><wfw:commentRss>http://blogs.msdn.com/johan/commentrss.aspx?PostID=6531187</wfw:commentRss><description>&lt;p&gt;This is a continuation of my previous post with the imaginative name &lt;a href="http://blogs.msdn.com/johan/archive/2007/11/13/getting-started-with-windbg-part-i.aspx"&gt;Getting started with windbg - part I&lt;/a&gt;. I'll be assuming that you've read it, so if you haven't I suggest you check it out first. We're still working with the same sample dump, so I'll pretty much pick up right where we left off.&lt;/p&gt; &lt;h1&gt;More useful commands&lt;/h1&gt; &lt;p&gt;Last time we used some nice commands from the sos-extension to look at the running callstacks, the requests, the CPU load of the threads, etc. We also dug deeper into the callstack to see what distinguished name we used for a SearchRequest. We'll keep using these commands, but also learn a few new ones.&lt;/p&gt; &lt;h2&gt;!dumpstackobjects (!dso)&lt;/h2&gt; &lt;p&gt;Now, imagine that we're looking at a specific thread and would like to see all managed objects referenced to by the current stack. Is there a way for us to do this? - There most certainly is. It's called dumpstackobjects, or dso for short. If we run it on the current thread we'll see a listing of objects that are referenced by the callstack. The whole output would look something like this (trimmed down to size):&lt;/p&gt; &lt;div class="DebugSample"&gt;0:050&amp;gt; !dso&lt;br&gt;OS Thread Id: 0x1e8c (50)&lt;br&gt;ESP/REG&amp;nbsp; Object&amp;nbsp;&amp;nbsp; Name&lt;br&gt;17a9e534 0741f860 System.RuntimeType&lt;br&gt;17a9e6b8 271fdfe0 System.DirectoryServices.Protocols.LdapConnection&lt;br&gt;17a9e6bc 27246f20 System.DirectoryServices.Protocols.SEC_WINNT_AUTH_IDENTITY_EX&lt;br&gt;17a9e740 271fdfe0 System.DirectoryServices.Protocols.LdapConnection&lt;br&gt;17a9e744 27246f20 System.DirectoryServices.Protocols.SEC_WINNT_AUTH_IDENTITY_EX&lt;br&gt;17a9e764 27246f20 System.DirectoryServices.Protocols.SEC_WINNT_AUTH_IDENTITY_EX&lt;br&gt;17a9e768 271fdfe0 System.DirectoryServices.Protocols.LdapConnection&lt;br&gt;17a9e780 271fdfe0 System.DirectoryServices.Protocols.LdapConnection&lt;br&gt;17a9e784 27246e38 System.DirectoryServices.Protocols.SearchRequest&lt;br&gt;17a9e794 271fdf14 System.DirectoryServices.Protocols.LdapDirectoryIdentifier&lt;br&gt;17a9e7a8 27246ef8 System.Collections.ArrayList&lt;br&gt;17a9e7bc 27246ef8 System.Collections.ArrayList&lt;br&gt;17a9e7c8 271fdfe0 System.DirectoryServices.Protocols.LdapConnection&lt;br&gt;17a9e8a4 27246e38 System.DirectoryServices.Protocols.SearchRequest&lt;br&gt;17a9e8d0 27246ed8 System.Object[]&amp;nbsp;&amp;nbsp;&amp;nbsp; (System.Object[])&lt;br&gt;17a9e8e0 073ff6b8 System.String&amp;nbsp;&amp;nbsp;&amp;nbsp; cn&lt;br&gt;17a9e8e4 271fdfe0 System.DirectoryServices.Protocols.LdapConnection&lt;br&gt;17a9e8f4 27246d00 System.String&amp;nbsp;&amp;nbsp;&amp;nbsp; CN=Dummy,CN=Accounts,CN=useradm,DC=Dummy,DC=net&lt;br&gt;17a9e8f8 271fdfe0 System.DirectoryServices.Protocols.LdapConnection&lt;br&gt;17a9e8fc 27246e38 System.DirectoryServices.Protocols.SearchRequest&lt;br&gt;17a9e910 03380310 System.String&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;17a9e914 27246e24 System.Object[]&amp;nbsp;&amp;nbsp;&amp;nbsp; (System.String[])&lt;br&gt;17a9e918 272399a8 System.String&amp;nbsp;&amp;nbsp;&amp;nbsp; CN=OID-Dummy-ABC123,CN=Dummy,CN=Accounts,CN=useradm,DC=Dummy,DC=net&lt;br&gt;17a9e91c 27246ddc System.String&amp;nbsp;&amp;nbsp;&amp;nbsp; (CN=OID-Dummy-ABC123)&lt;br&gt;...etc...&lt;/div&gt; &lt;p&gt;This is extremely useful when we want to see all the objects referenced by this thread alone. If you want to analyze one of the objects, simply copy the the address from the Object-column and use !dumpobject:&lt;/p&gt; &lt;div class="DebugSample"&gt;0:050&amp;gt; !do 271fdfe0 &lt;br&gt;Name: System.DirectoryServices.Protocols.LdapConnection&lt;br&gt;MethodTable: 14a2040c&lt;br&gt;EEClass: 149daf08&lt;br&gt;Size: 56(0x38) bytes&lt;br&gt;(C:\WINDOWS\assembly\GAC_MSIL\System.DirectoryServices.Protocols\2.0.0.0__b03f5f7f11d50a3a\System.DirectoryServices.Protocols.dll)&lt;br&gt;Fields:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MT&amp;nbsp;&amp;nbsp;&amp;nbsp; Field&amp;nbsp;&amp;nbsp; Offset&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Type VT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Attr&amp;nbsp;&amp;nbsp;&amp;nbsp; Value Name&lt;br&gt;14a2078c&amp;nbsp; 40000c3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4 ...NetworkCredential&amp;nbsp; 0 instance 00000000 directoryCredential&lt;br&gt;14a2144c&amp;nbsp; 40000c4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 8 ...ificateCollection&amp;nbsp; 0 instance 271fe018 certificatesCollection&lt;br&gt;1202af88&amp;nbsp; 40000c5&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 10&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.TimeSpan&amp;nbsp; 1 instance 271fdff0 connectionTimeOut&lt;br&gt;1466fe50&amp;nbsp; 40000c6&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; c ...rectoryIdentifier&amp;nbsp; 0 instance 271fdf14 directoryIdentifier&lt;br&gt;14a2034c&amp;nbsp; 4000236&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 24&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Int32&amp;nbsp; 0 instance&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2 connectionAuthType&lt;br&gt;14a223a4&amp;nbsp; 4000237&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 18 ...dapSessionOptions&amp;nbsp; 0 instance 271fe2d8 options&lt;br&gt;0fb896d8&amp;nbsp; 4000238&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 28&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.IntPtr&amp;nbsp; 0 instance 564180944 ldapHandle&lt;br&gt;120261c8&amp;nbsp; 4000239&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2c&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Boolean&amp;nbsp; 0 instance&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 disposed&lt;br&gt;120261c8&amp;nbsp; 400023a&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2d&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Boolean&amp;nbsp; 0 instance&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 bounded&lt;br&gt;120261c8&amp;nbsp; 400023b&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2e&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Boolean&amp;nbsp; 0 instance&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 needRebind&lt;br&gt;14a22084&amp;nbsp; 400023e&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1c ...pResponseCallback&amp;nbsp; 0 instance 271fe03c fd&lt;br&gt;120261c8&amp;nbsp; 4000243&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2f&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Boolean&amp;nbsp; 0 instance&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 setFQDNDone&lt;br&gt;120261c8&amp;nbsp; 4000244&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 30&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Boolean&amp;nbsp; 0 instance&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1 automaticBind&lt;br&gt;120261c8&amp;nbsp; 4000245&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 31&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Boolean&amp;nbsp; 0 instance&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1 needDispose&lt;br&gt;120261c8&amp;nbsp; 4000246&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 32&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Boolean&amp;nbsp; 0 instance&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1 connected&lt;br&gt;14a2267c&amp;nbsp; 4000247&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 20 ...s.QUERYCLIENTCERT&amp;nbsp; 0 instance 271fe394 clientCertificateRoutine&lt;br&gt;0fd314bc&amp;nbsp; 400023c&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 20 ...ections.Hashtable&amp;nbsp; 0&amp;nbsp;&amp;nbsp; shared&amp;nbsp;&amp;nbsp; static handleTable&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;gt;&amp;gt; Domain:Value&amp;nbsp; 0019daf0:NotInit&amp;nbsp; 11b42540:073fe504 &amp;lt;&amp;lt;&lt;br&gt;02c36ca0&amp;nbsp; 400023d&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 24&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Object&amp;nbsp; 0&amp;nbsp;&amp;nbsp; shared&amp;nbsp;&amp;nbsp; static objectLock&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;gt;&amp;gt; Domain:Value&amp;nbsp; 0019daf0:NotInit&amp;nbsp; 11b42540:073fe53c &amp;lt;&amp;lt;&lt;br&gt;0fd314bc&amp;nbsp; 400023f&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 28 ...ections.Hashtable&amp;nbsp; 0&amp;nbsp;&amp;nbsp; shared&amp;nbsp;&amp;nbsp; static asyncResultTable&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;gt;&amp;gt; Domain:Value&amp;nbsp; 0019daf0:NotInit&amp;nbsp; 11b42540:073fe610 &amp;lt;&amp;lt;&lt;br&gt;14a21864&amp;nbsp; 4000240&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2c ...lResultsProcessor&amp;nbsp; 0&amp;nbsp;&amp;nbsp; shared&amp;nbsp;&amp;nbsp; static partialResultsProcessor&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;gt;&amp;gt; Domain:Value&amp;nbsp; 0019daf0:NotInit&amp;nbsp; 11b42540:073fe678 &amp;lt;&amp;lt;&lt;br&gt;12305e94&amp;nbsp; 4000241&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 30 ....ManualResetEvent&amp;nbsp; 0&amp;nbsp;&amp;nbsp; shared&amp;nbsp;&amp;nbsp; static waitHandle&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;gt;&amp;gt; Domain:Value&amp;nbsp; 0019daf0:NotInit&amp;nbsp; 11b42540:073fe64c &amp;lt;&amp;lt;&lt;br&gt;14a21954&amp;nbsp; 4000242&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 34 ...lResultsRetriever&amp;nbsp; 0&amp;nbsp;&amp;nbsp; shared&amp;nbsp;&amp;nbsp; static retriever&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;gt;&amp;gt; Domain:Value&amp;nbsp; 0019daf0:NotInit&amp;nbsp; 11b42540:073fe6a8 &amp;lt;&amp;lt;&lt;/div&gt; &lt;h2&gt;&amp;nbsp;&lt;/h2&gt; &lt;h2&gt;!dumparray (!da)&lt;/h2&gt; &lt;p&gt;As you might have noticed we have a couple of&amp;nbsp;object arrays on the stack.&amp;nbsp;Look for the System.Object[]-type in the listing above and you'll find them. If you execute !dumpobject on an array you'll only get information about the array itself, not it's contents. To get information about what's in the array we need to use the !dumparray-command, or !da for short.&lt;/p&gt; &lt;div class="DebugSample"&gt;0:050&amp;gt; !do 27239b98 &lt;br&gt;Name: System.Object[]&lt;br&gt;MethodTable: 02c3896c&lt;br&gt;EEClass: 02c388ec&lt;br&gt;Size: 24(0x18) bytes&lt;br&gt;Array: Rank 1, Number of elements 2, Type CLASS&lt;br&gt;Element Type: System.String&lt;br&gt;Fields:&lt;br&gt;None&lt;br&gt;&lt;br&gt;0:050&amp;gt; !da 27239b98 &lt;br&gt;Name: System.String[]&lt;br&gt;MethodTable: 02c3896c&lt;br&gt;EEClass: 02c388ec&lt;br&gt;Size: 24(0x18) bytes&lt;br&gt;Array: Rank 1, Number of elements 2, Type CLASS&lt;br&gt;Element Methodtable: 02c39310&lt;br&gt;[0] 272399a8&lt;br&gt;[1] 27239a44&lt;/div&gt; &lt;p&gt;As you can see the !dumparray-command gives us a bit more information about the object. We can see that it contains System.String data and we get the addresses of the two items in the array.&amp;nbsp;Since they're System.String-objects we can simply&amp;nbsp;use !dumpobject to view their contents.&lt;/p&gt; &lt;h2&gt;!objsize&lt;/h2&gt; &lt;p&gt;If you look at the listing above you'll see that the size of the object is listed as 24 bytes. To paraphrase Obi Wan Kenobi: "This is true, from a certain point of view." The 24 bytes are the size of the System.Object[]-object itself. Not it's contents. As you can see when we execute !dumparray, the array only contains two references to two strings. These strings are individual objects and could be 32 MB for all we know, so the 24 bytes are not the &lt;em&gt;total &lt;/em&gt;size of the array, but it would still be correct to claim that the System.Object[] is only 24 bytes large.&lt;/p&gt; &lt;p&gt;To get the &lt;em&gt;total&lt;/em&gt; size of the object we use the !objsize command:&lt;/p&gt; &lt;div class="DebugSample"&gt;0:050&amp;gt; !objsize 27239b98 &lt;br&gt;sizeof(27239b98) =&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 348 (&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x15c) bytes (System.Object[])&lt;/div&gt; &lt;p&gt;!objsize will iterate through all the child objects referenced by the&amp;nbsp;object, as well as all the grandchildren and so on. Apparently the total size of the array and it's child objects is 348 bytes.&lt;/p&gt; &lt;p&gt;If there are a lot of child objects it may take some time for !objsize to calculate the total size of the object. You should also be aware that !objsize may not always be as smart as you'd like. If, for example, you have a custom button control that references it's parent aspx-page you'd get the total size of the aspx-page and all it's child controls. In other words: If !objsize claims that the object in question is ridiculously large you might want to manually check what the object references using !dumpobject.&lt;/p&gt; &lt;h2&gt;!dumpheap&lt;/h2&gt; &lt;p&gt;This is another command that I use frequently. It is, however a command that you will want to use with at least one argument. Dumpheap with no arguments will dump &lt;em&gt;all &lt;/em&gt;objects on the heap, so I usually begin by using the -stat argument, which in itself will write a lot of info on the screen, but it will at least be summarized. Here' you'll find the trimmed down output of !dumpheap -stat:&lt;/p&gt; &lt;div class="DebugSample"&gt;0:050&amp;gt; !dumpheap -stat&lt;br&gt;------------------------------&lt;br&gt;Heap 0&lt;br&gt;total 2754508 objects&lt;br&gt;------------------------------&lt;br&gt;Heap 1&lt;br&gt;total 2761329 objects&lt;br&gt;------------------------------&lt;br&gt;total 5515837 objects&lt;br&gt;Statistics:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MT&amp;nbsp;&amp;nbsp;&amp;nbsp; Count&amp;nbsp;&amp;nbsp;&amp;nbsp; TotalSize Class Name&lt;br&gt;16e0a6d8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 12 System.Collections.Generic.ObjectEqualityComparer`1[[System.Data.ProviderBase.DbConnectionInternal, System.Data]]&lt;br&gt;16d9cd9c&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 12 System.Xml.Serialization.Configuration.DateTimeSerializationSection+DateTimeSerializationMode&lt;br&gt;16d9bf30&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 12 System.Diagnostics.OrdinalCaseInsensitiveComparer&lt;br&gt;16d9112c&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 12 System.Xml.Serialization.NameTable&lt;br&gt;16d7f664&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 12 System.Xml.Serialization.TempAssemblyCache&lt;br&gt;163ea85c&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 12 System.Data.Res&lt;br&gt;1501e4c4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 12 System.Collections.Generic.ObjectEqualityComparer`1[[System.Web.UI.Control, System.Web]]&lt;br&gt;14efb138&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 12 System.Net.TimeoutValidator&lt;br&gt;14ef9964&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 12 System.Net.Cache.HttpRequestCacheLevel&lt;br&gt;14ef77a8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 12 Microsoft.Win32.WinInetCache&lt;br&gt;14ef68e4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 12 System.Net.WebRequest+WebProxyWrapper&lt;br&gt;14ef658c&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 12 System.Net.Configuration.ProxyElement+BypassOnLocalValues&lt;br&gt;14ef63d8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 12 System.Net.Configuration.ProxyElement+AutoDetectValues&lt;br&gt;14ef5b68&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 12 System.Net.CaseInsensitiveAscii&lt;br&gt;14ef5610&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 12 System.Net.HeaderInfoTable&lt;br&gt;14ef4718&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 12 System.Net.HttpRequestCreator&lt;br&gt;14db6710&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 12 System.Web.Configuration.MachineKeyValidationConverter&lt;br&gt;14db3140&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 12 System.Collections.Generic.ObjectEqualityComparer`1[[System.Runtime.Serialization.MemberHolder, mscorlib]]&lt;br&gt;14b3f4d8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 12 System.Web.UI.SupportsEventValidationAttribute&lt;br&gt;...etc...&lt;br&gt;14a276a8&amp;nbsp;&amp;nbsp;&amp;nbsp; 19578&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 704808 System.DirectoryServices.Interop.AdsValueHelper&lt;br&gt;14a2ea24&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 9196&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 735680 System.Web.UI.WebControls.Label&lt;br&gt;14a2e51c&amp;nbsp;&amp;nbsp;&amp;nbsp; 16862&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 741928 System.Web.UI.WebControls.Style&lt;br&gt;125778ec&amp;nbsp;&amp;nbsp;&amp;nbsp; 48015&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 768240 System.Collections.Specialized.NameObjectCollectionBase+NameObjectEntry&lt;br&gt;120261c8&amp;nbsp;&amp;nbsp;&amp;nbsp; 65842&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 790104 System.Boolean&lt;br&gt;14a2ee7c&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 9198&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 809424 System.Web.UI.WebControls.Table&lt;br&gt;14b311c4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 9647&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 810348 System.Web.UI.WebControls.Image&lt;br&gt;13a2b7dc&amp;nbsp;&amp;nbsp;&amp;nbsp; 34913&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 837912 System.Web.HttpServerVarsCollectionEntry&lt;br&gt;14b303a4&amp;nbsp;&amp;nbsp;&amp;nbsp; 10605&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 848400 System.Web.UI.WebControls.HyperLink&lt;br&gt;14d8e3d4&amp;nbsp;&amp;nbsp;&amp;nbsp; 77748&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 932976 Microsoft.Web.UI.WebControls.BaseChildNodeCollection+ActionType&lt;br&gt;14db90ac&amp;nbsp;&amp;nbsp;&amp;nbsp; 81372&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 976464 System.Web.UI.WebControls.FontInfo&lt;br&gt;14b30694&amp;nbsp;&amp;nbsp;&amp;nbsp; 28648&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1031328 System.Web.UI.WebControls.TableRow+CellControlCollection&lt;br&gt;14d8fdbc&amp;nbsp;&amp;nbsp;&amp;nbsp; 38912&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1089536 Microsoft.Web.UI.WebControls.TreeNodeCollection&lt;br&gt;14b3d0bc&amp;nbsp;&amp;nbsp;&amp;nbsp; 86592&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1385472 System.Web.UI.Pair&lt;br&gt;1466c5c4&amp;nbsp;&amp;nbsp;&amp;nbsp; 39305&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1414980 System.Web.UI.ControlCollection&lt;br&gt;14d8e48c&amp;nbsp;&amp;nbsp;&amp;nbsp; 77748&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1865952 Microsoft.Web.UI.WebControls.BaseChildNodeCollection+Action&lt;br&gt;1545061c&amp;nbsp;&amp;nbsp;&amp;nbsp; 38874&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2176944 Microsoft.Web.UI.WebControls.TreeNode&lt;br&gt;14b30eec&amp;nbsp;&amp;nbsp;&amp;nbsp; 52668&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2317392 System.Web.UI.WebControls.TableItemStyle&lt;br&gt;14a2f804&amp;nbsp;&amp;nbsp;&amp;nbsp; 28515&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2395260 System.Web.UI.WebControls.TableRow&lt;br&gt;14a2be6c&amp;nbsp;&amp;nbsp;&amp;nbsp; 40894&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2453640 System.Web.UI.LiteralControl&lt;br&gt;0fd3da00&amp;nbsp;&amp;nbsp; 228792&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2745504 System.Int32&lt;br&gt;14b3e3ac&amp;nbsp;&amp;nbsp; 244793&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2937516 System.Web.UI.IndexedString&lt;br&gt;14a2de94&amp;nbsp;&amp;nbsp; 198580&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3177280 System.Web.UI.StateBag&lt;br&gt;1466c454&amp;nbsp;&amp;nbsp;&amp;nbsp; 80512&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3542528 System.Web.UI.Control+OccasionalFields&lt;br&gt;12302c2c&amp;nbsp;&amp;nbsp; 205849&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4116980 System.Collections.Specialized.HybridDictionary&lt;br&gt;14b30024&amp;nbsp;&amp;nbsp;&amp;nbsp; 52934&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4446456 System.Web.UI.WebControls.TableCell&lt;br&gt;12302f2c&amp;nbsp;&amp;nbsp; 178294&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4992232 System.Collections.Specialized.ListDictionary&lt;br&gt;14a2e284&amp;nbsp;&amp;nbsp; 412762&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 6604192 System.Web.UI.StateItem&lt;br&gt;14d8ce64&amp;nbsp;&amp;nbsp; 117078&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 7024680 Microsoft.Web.UI.WebControls.CssCollection&lt;br&gt;0fd314bc&amp;nbsp;&amp;nbsp; 132065&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 7395640 System.Collections.Hashtable&lt;br&gt;1230319c&amp;nbsp;&amp;nbsp; 422580&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 8451600 System.Collections.Specialized.ListDictionary+DictionaryNode&lt;br&gt;1202a58c&amp;nbsp;&amp;nbsp; 380438&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 9130512 System.Collections.ArrayList&lt;br&gt;0fd32050&amp;nbsp;&amp;nbsp; 133000&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 22582944 System.Collections.Hashtable+bucket[]&lt;br&gt;02c3896c&amp;nbsp;&amp;nbsp; 649842&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 23275900 System.Object[]&lt;br&gt;0fd3c12c&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3471&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 36385536 System.Byte[]&lt;br&gt;001fee20&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 338&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 65409920&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Free&lt;br&gt;02c39310&amp;nbsp;&amp;nbsp; 683083&amp;nbsp;&amp;nbsp;&amp;nbsp; 161821000 System.String&lt;br&gt;Total 5515837 objects&lt;br&gt;Fragmented blocks larger than 0.5 MB:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Addr&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Size&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Followed by&lt;br&gt;2adf31cc&amp;nbsp;&amp;nbsp;&amp;nbsp; 2.0MB&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2aff85d8 System.String&lt;br&gt;2b006a2c&amp;nbsp;&amp;nbsp; 20.3MB&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2c4530d8 System.Net.SocketAddress&lt;/div&gt; &lt;p&gt;As you can see we now get a listing sorted by size of all object-types on the heap. You'll usually find strings down at the bottom since that's what is commonly used the most.&lt;/p&gt; &lt;p&gt;Other useful arguments are -type and -mt (which stands for MethodTable). Using them you're able to see all objects of a specific type. For example. If we want to look at all HttpRequestCreators on the heap (there are one) you'll simply copy it's MethodTable which you'll find in the listing above (14ef4718) and use !dumpheap -mt&lt;/p&gt; &lt;div class="DebugSample"&gt;0:050&amp;gt; !dumpheap -mt 14ef4718&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;------------------------------&lt;br&gt;Heap 0&lt;br&gt;Address&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Size&lt;br&gt;0342ccf8 14ef4718&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 12&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;total 1 objects&lt;br&gt;------------------------------&lt;br&gt;Heap 1&lt;br&gt;Address&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Size&lt;br&gt;total 0 objects&lt;br&gt;------------------------------&lt;br&gt;total 1 objects&lt;br&gt;Statistics:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MT&amp;nbsp;&amp;nbsp;&amp;nbsp; Count&amp;nbsp;&amp;nbsp;&amp;nbsp; TotalSize Class Name&lt;br&gt;14ef4718&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 12 System.Net.HttpRequestCreator&lt;/div&gt; &lt;p&gt;This gives us the address of the object and if we'd like to inspect it closer we simply use !dumpobject on that address.&lt;/p&gt; &lt;p&gt;!dumpheap -type works pretty much the same way, except this time you filter the results by class name. !dumpheap -type performs a substring match, so if you write !dumpheap -type System.Web you'll get every object who's class name contains System.Web, which would be a lot.&lt;/p&gt; &lt;p&gt;Other useful arguments are -min and -max which accept a number representing the minimum/maximum number of bytes the object size should be. This can be really useful when troubleshooting string-abuse, etc. Also !dumpheap -stat -min 85000 would list all objects on the large object heap.&lt;/p&gt; &lt;h1&gt;Putting the tools to use&lt;/h1&gt; &lt;p&gt;I'd now like to use the commands we've covered in a bit more practical scenario. The dump we've been looking at is from a previous case of mine. The application in question was running on a Web garden with two workerprocesses. Session State was handled by a SQL Server. The customer was experiencing performance issues and the problem description was hazy at best. Anyway I had tons of dumps to work with, so I simply poked around to see what I could find. One thing I did pretty early on was to look at caching. According to the customer&amp;nbsp;they weren't using the cache at all, but I usually find it best to double-check this type of thing.&lt;/p&gt; &lt;h2&gt;Determining the size of the cache&lt;/h2&gt; &lt;p&gt;To find out how much data was kept in the cache I first needed to find the System.Web.Caching.Cache class.&amp;nbsp;So I ran !dumpheap -stat -type System.Web.Caching.Cache. Note that I also used the -stat argument. Otherwise I would have gotten a very long list of System.Web.Caching.CacheKeys and System.Web.Caching.CacheEntrys as well. Anyway, here's the result:&lt;/p&gt; &lt;div class="DebugSample"&gt;0:050&amp;gt; !dumpheap -type System.Web.Caching.Cache -stat&lt;br&gt;------------------------------&lt;br&gt;Heap 0&lt;br&gt;total 665 objects&lt;br&gt;------------------------------&lt;br&gt;Heap 1&lt;br&gt;total 1084 objects&lt;br&gt;------------------------------&lt;br&gt;total 1749 objects&lt;br&gt;Statistics:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MT&amp;nbsp;&amp;nbsp;&amp;nbsp; Count&amp;nbsp;&amp;nbsp;&amp;nbsp; TotalSize Class Name&lt;br&gt;123056f8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 12 System.Web.Caching.CacheKeyComparer&lt;br&gt;&lt;font color="#ff0000"&gt;1230494c&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 12 System.Web.Caching.Cache&lt;br&gt;&lt;/font&gt;1230500c&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 24 System.Web.Caching.CacheMultiple&lt;br&gt;1230514c&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 32 System.Web.Caching.CacheMemoryStats&lt;br&gt;123053b4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 36 System.Web.Caching.CacheMemoryTotalMemoryPressure&lt;br&gt;123059bc&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 40 System.Web.Caching.CacheUsage&lt;br&gt;12304bdc&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 48 System.Web.Caching.CacheCommon&lt;br&gt;123054f4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 52 System.Web.Caching.CacheMemoryPrivateBytesPressure&lt;br&gt;12305874&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 64 System.Web.Caching.CacheExpires&lt;br&gt;12304e64&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 200 System.Web.Caching.CacheSingle&lt;br&gt;1255b594&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 85&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1360 System.Web.Caching.CacheDependency+DepFileInfo&lt;br&gt;123046c4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 40&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1440 System.Web.Caching.CacheDependency&lt;br&gt;123042ec&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 47&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1504 System.Web.Caching.CacheItemRemovedCallback&lt;br&gt;123063fc&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 832&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 16640 System.Web.Caching.CacheKey&lt;br&gt;12306820&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 732&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 52704 System.Web.Caching.CacheEntry&lt;br&gt;Total 1749 objects&lt;/div&gt; &lt;p&gt;Okay, so now I had the MethodTable for the System.Web.Caching.Cache object. Therefore I could now get the address to the object itself. I did this by asking !dumpheap to list all the objects on the heap with that MethodTable. I knew that there was just going to be one hit:&lt;/p&gt; &lt;div class="DebugSample"&gt;0:050&amp;gt; !dumpheap -mt 1230494c&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;------------------------------&lt;br&gt;Heap 0&lt;br&gt;Address&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Size&lt;br&gt;&lt;font color="#ff0000"&gt;03392d20&lt;/font&gt; 1230494c&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 12&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;total 1 objects&lt;br&gt;------------------------------&lt;br&gt;Heap 1&lt;br&gt;Address&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Size&lt;br&gt;total 0 objects&lt;br&gt;------------------------------&lt;br&gt;total 1 objects&lt;br&gt;Statistics:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MT&amp;nbsp;&amp;nbsp;&amp;nbsp; Count&amp;nbsp;&amp;nbsp;&amp;nbsp; TotalSize Class Name&lt;br&gt;1230494c&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 12 System.Web.Caching.Cache&lt;br&gt;Total 1 objects&lt;/div&gt; &lt;p&gt;So now I ran !objsize on this object to see how big it was. This took a little time to calculate, since the cache is quite complex and there are a lot of children to iterate through.&lt;/p&gt; &lt;div class="DebugSample"&gt;0:050&amp;gt; !objsize 03392d20 &lt;br&gt;sizeof(03392d20) =&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#ff0000"&gt;266640828&lt;/font&gt; (&amp;nbsp;&amp;nbsp; 0xfe49dbc) bytes (System.Web.Caching.Cache)&lt;/div&gt; &lt;p&gt;So the cache is 266 MB in size. That's quite a lot&amp;nbsp;considering the fact that the customer claimed that they weren't using the cache at all!&lt;/p&gt; &lt;h2&gt;What is being cached?&lt;/h2&gt; &lt;p&gt;To sample what the customer was caching I then took a look at a few of the CacheEntrys. I already had the MethodTable for the System.Web.Caching.CacheEntry from when I ran !dumpheap -type System.Web.Caching.Cache -stat (above), so I could use that to retrieve all CacheEntrys.&lt;/p&gt; &lt;div class="DebugSample"&gt;0:050&amp;gt; !dumpheap -mt 12306820&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;------------------------------&lt;br&gt;Heap 0&lt;br&gt;Address&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Size&lt;br&gt;033950bc 12306820&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 72&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;033a20d8 12306820&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 72&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;033ac79c 12306820&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 72&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;033da21c 12306820&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 72&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;033f04c4 12306820&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 72&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;03428ec8 12306820&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 72&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;0344dab4 12306820&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 72&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;03815d00 12306820&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 72&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;038265d8 12306820&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 72&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;....etc...&lt;br&gt;03af7010 12306820&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 72&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;03b291bc 12306820&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 72&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;03b2c674 12306820&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 72&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;03b6dca0 12306820&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 72&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;03b797dc 12306820&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 72&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;03b85318 12306820&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 72&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;03ba9150 12306820&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 72&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;03c258cc 12306820&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 72&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;03de43c8 12306820&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 72&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&lt;font color="#ff0000"&gt;03e160f8&lt;/font&gt; 12306820&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 72&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;total 382 objects&lt;br&gt;------------------------------&lt;br&gt;total 732 objects&lt;/div&gt; &lt;p&gt;Another valid command that would have given me the exact same output would off course have been !dumpheap -type System.Web.Caching.CacheEntry.&lt;/p&gt; &lt;p&gt;Okay, so now I had a long list of CacheEntrys. To sample the contents I just picked an address and examined it by using !dumpobject&lt;/p&gt; &lt;div class="DebugSample"&gt;0:050&amp;gt; !do 03b2c674 &lt;br&gt;Name: System.Web.Caching.CacheEntry&lt;br&gt;MethodTable: 12306820&lt;br&gt;EEClass: 122f6470&lt;br&gt;Size: 72(0x48) bytes&lt;br&gt;(C:\WINDOWS\assembly\GAC_32\System.Web\2.0.0.0__b03f5f7f11d50a3a\System.Web.dll)&lt;br&gt;Fields:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MT&amp;nbsp;&amp;nbsp;&amp;nbsp; Field&amp;nbsp;&amp;nbsp; Offset&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Type VT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Attr&amp;nbsp;&amp;nbsp;&amp;nbsp; Value Name&lt;br&gt;02c39310&amp;nbsp; 4001327&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.String&amp;nbsp; 0 instance 03b2c600 _key&lt;br&gt;0fb8f1f8&amp;nbsp; 4001328&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; c&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Byte&amp;nbsp; 0 instance&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2 _bits&lt;br&gt;0fd3da00&amp;nbsp; 4001329&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Int32&amp;nbsp; 0 instance -1314181915 _hashCode&lt;br&gt;&lt;font color="#ff0000"&gt;02c36ca0&amp;nbsp; 4001330&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 10&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Object&amp;nbsp; 0 instance 03b2c644 _value&lt;br&gt;&lt;/font&gt;120219d0&amp;nbsp; 4001331&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1c&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.DateTime&amp;nbsp; 1 instance 03b2c690 _utcCreated&lt;br&gt;120219d0&amp;nbsp; 4001332&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 24&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.DateTime&amp;nbsp; 1 instance 03b2c698 _utcExpires&lt;br&gt;1202af88&amp;nbsp; 4001333&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2c&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.TimeSpan&amp;nbsp; 1 instance 03b2c6a0 _slidingExpiration&lt;br&gt;0fb8f1f8&amp;nbsp; 4001334&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; d&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Byte&amp;nbsp; 0 instance&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 7 _expiresBucket&lt;br&gt;123062d8&amp;nbsp; 4001335&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 34 ...g.ExpiresEntryRef&amp;nbsp; 1 instance 03b2c6a8 _expiresEntryRef&lt;br&gt;0fb8f1f8&amp;nbsp; 4001336&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; e&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Byte&amp;nbsp; 0 instance 4294967295 _usageBucket&lt;br&gt;12306738&amp;nbsp; 4001337&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 38 ...ing.UsageEntryRef&amp;nbsp; 1 instance 03b2c6ac _usageEntryRef&lt;br&gt;120219d0&amp;nbsp; 4001338&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3c&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.DateTime&amp;nbsp; 1 instance 03b2c6b0 _utcLastUpdate&lt;br&gt;123046c4&amp;nbsp; 4001339&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 14 ...g.CacheDependency&amp;nbsp; 0 instance 00000000 _dependency&lt;br&gt;02c36ca0&amp;nbsp; 400133a&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 18&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Object&amp;nbsp; 0 instance 033d8344 _onRemovedTargets&lt;br&gt;120219d0&amp;nbsp; 400132d&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1bc&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.DateTime&amp;nbsp; 1&amp;nbsp;&amp;nbsp; shared&amp;nbsp;&amp;nbsp; static NoAbsoluteExpiration&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;gt;&amp;gt; Domain:Value&amp;nbsp; 0019daf0:NotInit&amp;nbsp; 11b42540:03395104 &amp;lt;&amp;lt;&lt;br&gt;1202af88&amp;nbsp; 400132e&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1c0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.TimeSpan&amp;nbsp; 1&amp;nbsp;&amp;nbsp; shared&amp;nbsp;&amp;nbsp; static NoSlidingExpiration&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;gt;&amp;gt; Domain:Value&amp;nbsp; 0019daf0:NotInit&amp;nbsp; 11b42540:03395114 &amp;lt;&amp;lt;&lt;br&gt;1202af88&amp;nbsp; 400132f&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1c4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.TimeSpan&amp;nbsp; 1&amp;nbsp;&amp;nbsp; shared&amp;nbsp;&amp;nbsp; static OneYear&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;gt;&amp;gt; Domain:Value&amp;nbsp; 0019daf0:NotInit&amp;nbsp; 11b42540:03395124 &amp;lt;&amp;lt;&lt;/div&gt; &lt;p&gt;This dumped the&amp;nbsp;CacheEntry and it's properties. I figured the most interesting piece of information would be the _value, so&amp;nbsp;I simply copied the address of that property (look in the Value column) and used !dumpobject again.&lt;/p&gt; &lt;div class="DebugSample"&gt;0:000&amp;gt; !do 03e160c8 &lt;br&gt;&lt;font color="#ff0000"&gt;Name: System.Web.SessionState.InProcSessionState&lt;br&gt;&lt;/font&gt;MethodTable: 14dbad5c&lt;br&gt;EEClass: 14e43af8&lt;br&gt;Size: 48(0x30) bytes&lt;br&gt;(C:\WINDOWS\assembly\GAC_32\System.Web\2.0.0.0__b03f5f7f11d50a3a\System.Web.dll)&lt;br&gt;Fields:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MT&amp;nbsp;&amp;nbsp;&amp;nbsp; Field&amp;nbsp;&amp;nbsp; Offset&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Type VT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Attr&amp;nbsp;&amp;nbsp;&amp;nbsp; Value Name&lt;br&gt;1466c9d8&amp;nbsp; 4001d89&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4 ...ateItemCollection&amp;nbsp; 0 instance 1a7f5438 _sessionItems&lt;br&gt;1292672c&amp;nbsp; 4001d8a&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 8 ...ObjectsCollection&amp;nbsp; 0 instance 00000000 _staticObjects&lt;br&gt;0fd3da00&amp;nbsp; 4001d8b&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; c&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Int32&amp;nbsp; 0 instance&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 20 _timeout&lt;br&gt;120261c8&amp;nbsp; 4001d8c&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 18&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Boolean&amp;nbsp; 0 instance&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 _locked&lt;br&gt;120219d0&amp;nbsp; 4001d8d&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1c&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.DateTime&amp;nbsp; 1 instance 03e160e4 _utcLockDate&lt;br&gt;0fd3da00&amp;nbsp; 4001d8e&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 10&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Int32&amp;nbsp; 0 instance&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1 _lockCookie&lt;br&gt;1202bf60&amp;nbsp; 4001d8f&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 24 ...ReadWriteSpinLock&amp;nbsp; 1 instance 03e160ec _spinLock&lt;br&gt;0fd3da00&amp;nbsp; 4001d90&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 14&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Int32&amp;nbsp; 0 instance&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 _flags&lt;/div&gt; &lt;p&gt;Here I found something interesting. The value stored was in fact an InProcSessionState object, which -in case&amp;nbsp;you didn't know this before- is stored in the Cache.&amp;nbsp;This meant that the claim that the application was using SQL Server Session state was incorrect. &lt;/p&gt; &lt;p&gt;As it turned out the customer had temporarily switched to In-process for a brief test, but forgotten to switch back again. Had the application been live they would have spotted this in no time, but since they were stress testing they weren't really paying attention to &lt;em&gt;what&lt;/em&gt; the server was returning as long as it returned &lt;em&gt;something&lt;/em&gt;. Unknowingly running session state in-process compromised the stress-test in a number of ways.&amp;nbsp;For example:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Memory usage for the worker process was a lot higher than expected&lt;/li&gt; &lt;li&gt;The load on the network was not as high as it would be under normal circumstances&lt;/li&gt; &lt;li&gt;The response times were no longer accountable&lt;/li&gt; &lt;li&gt;The SQL-server was not stressed to the extent it should have been, so any potential bottlenecks there went unnoticed&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;This was in no way the final solution for their performance issue. There were a lot more things we had to deal with, but I think it's a really nice example of how to use only three commands (!dumpheap, !objsize &amp;amp; !dumpobject) to dig up some really useful information.&lt;/p&gt; &lt;p&gt;Later! / Johan&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=6531187" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/johan/archive/tags/SessionState/default.aspx">SessionState</category><category domain="http://blogs.msdn.com/johan/archive/tags/WinDbg/default.aspx">WinDbg</category><category domain="http://blogs.msdn.com/johan/archive/tags/Managed+Heap/default.aspx">Managed Heap</category><category domain="http://blogs.msdn.com/johan/archive/tags/Tools/default.aspx">Tools</category><category domain="http://blogs.msdn.com/johan/archive/tags/Cache/default.aspx">Cache</category><category domain="http://blogs.msdn.com/johan/archive/tags/Debugging+School/default.aspx">Debugging School</category><category domain="http://blogs.msdn.com/johan/archive/tags/ASP.NET/default.aspx">ASP.NET</category></item><item><title>Getting started with windbg - part I</title><link>http://blogs.msdn.com/johan/archive/2007/11/13/getting-started-with-windbg-part-i.aspx</link><pubDate>Tue, 13 Nov 2007 17:20:11 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:6174183</guid><dc:creator>JohanS</dc:creator><slash:comments>42</slash:comments><comments>http://blogs.msdn.com/johan/comments/6174183.aspx</comments><wfw:commentRss>http://blogs.msdn.com/johan/commentrss.aspx?PostID=6174183</wfw:commentRss><description>&lt;p&gt;Okay, I've previously written some random posts about how to &lt;a href="http://blogs.msdn.com/johan/archive/2007/01/11/how-to-install-windbg-and-get-your-first-memory-dump.aspx"&gt;set up windbg&lt;/a&gt; and &lt;a href="http://blogs.msdn.com/johan/archive/2007/01/11/i-am-getting-outofmemoryexceptions-how-can-i-troubleshoot-this.aspx"&gt;how to troubleshoot OutOfMemoryExceptions&lt;/a&gt;. I thought I'd take a few steps back and review some of the basics in order to help you get started on using this fantastic tool.&lt;/p&gt; &lt;h1&gt;Basic Configuration&lt;/h1&gt; &lt;ol&gt; &lt;li&gt;Copy sos.dll from the framework directory to the folder where you installed windbg. Make sure you copy it from the same Framework version as the one you wish to investigate. If you'll be working with both 1.1 and 2.0 you can rename the SOS.dlls to SOS11.dll and SOS20.dll or put them in separate folders.  &lt;li&gt;Create a folder where you want to cache all the symbol files. For example: "C:\Symbols".  &lt;li&gt;Start windbg and open the dialogue to configure the symbol path by clicking File -&amp;gt; Symbol File Path.  &lt;li&gt;Enter the path, as well as the address from which you'll want to download missing symbols using the following syntax:&lt;br&gt;&lt;span class="InlineCode"&gt;srv*[cache path]*[symbols path]&lt;/span&gt;&lt;br&gt;I'd recommend the following path:&lt;br&gt;&lt;span class="InlineCode"&gt;srv*c:\symbols\public*http://msdl.microsoft.com/download/symbols&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;You should now be set to go. You're now ready to open up a saved dump, or attach to a process&lt;/p&gt; &lt;h1&gt;Useful commands&lt;/h1&gt; &lt;p&gt;I'll be using a dump from an IIS6-server to demonstrate some useful commands.&lt;/p&gt; &lt;p&gt;The first thing you'll want to do is load SOS. You'll do this using the .load command. The syntax is simple. .load [extension filename]. So if you want to load sos and haven't renamed the .dll you'd simply write:&lt;/p&gt; &lt;div class="DebugSample"&gt;.load sos&lt;/div&gt; &lt;p&gt;You'll now have&amp;nbsp;all the cool commands from the SOS-extension at your disposal as well as the default windbg ones. Commands from extensions are always preceded by a "!", so if you want to run the help-command for sos&amp;nbsp;you'd write&lt;/p&gt; &lt;div class="DebugSample"&gt;!help&lt;/div&gt; &lt;p&gt;If you should happen to have two extensions with an identically named command you can always separate them by typing ![extension name].[command] Example:&lt;/p&gt; &lt;div class="DebugSample"&gt;!sos.help&lt;/div&gt; &lt;p&gt;Okay, now that we know how to run the commands from the extension, try running !help. It should give you the following result.&lt;/p&gt; &lt;div class="DebugSample"&gt;0:000&amp;gt; !help&lt;br&gt;-------------------------------------------------------------------------------&lt;br&gt;SOS is a debugger extension DLL designed to aid in the debugging of managed&lt;br&gt;programs. Functions are listed by category, then roughly in order of&lt;br&gt;importance. Shortcut names for popular functions are listed in parenthesis.&lt;br&gt;Type "!help &lt;functionname&gt;" for detailed info on that function. &lt;br&gt;&lt;br&gt;Object Inspection&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Examining code and stacks&lt;br&gt;-----------------------------&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -----------------------------&lt;br&gt;DumpObj (do)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Threads&lt;br&gt;DumpArray (da)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CLRStack&lt;br&gt;DumpStackObjects (dso)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IP2MD&lt;br&gt;DumpHeap&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; U&lt;br&gt;DumpVC&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DumpStack&lt;br&gt;GCRoot&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EEStack&lt;br&gt;ObjSize&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GCInfo&lt;br&gt;FinalizeQueue&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EHInfo&lt;br&gt;PrintException (pe)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; COMState&lt;br&gt;TraverseHeap&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BPMD &lt;br&gt;&lt;br&gt;Examining CLR data structures&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Diagnostic Utilities&lt;br&gt;-----------------------------&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -----------------------------&lt;br&gt;DumpDomain&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; VerifyHeap&lt;br&gt;EEHeap&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DumpLog&lt;br&gt;Name2EE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FindAppDomain&lt;br&gt;SyncBlk&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SaveModule&lt;br&gt;DumpMT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GCHandles&lt;br&gt;DumpClass&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GCHandleLeaks&lt;br&gt;DumpMD&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; VMMap&lt;br&gt;Token2EE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; VMStat&lt;br&gt;EEVersion&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ProcInfo &lt;br&gt;DumpModule&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; StopOnException (soe)&lt;br&gt;ThreadPool&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MinidumpMode &lt;br&gt;DumpAssembly&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;DumpMethodSig&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Other&lt;br&gt;DumpRuntimeTypes&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -----------------------------&lt;br&gt;DumpSig&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FAQ&lt;br&gt;RCWCleanupList&lt;br&gt;DumpIL&lt;/div&gt; &lt;p&gt;For more documentation on a specific command, type !help [name of command]&lt;/p&gt; &lt;h2&gt;.time&lt;/h2&gt; &lt;p&gt;This is not an SOS-command, which is evident by the command not beginning with a "!". Running the .Time command will show you relevant info about the time, as well as system uptime, process uptime and the amount of time spent in kernel &amp;amp; user mode.&lt;/p&gt; &lt;div class="DebugSample"&gt;0:000&amp;gt; .time&lt;br&gt;Debug session time: Tue Oct 23 08:38:35.000 2007 (GMT+1)&lt;br&gt;System Uptime: 4 days 17:48:01.906&lt;br&gt;Process Uptime: 0 days 0:24:37.000&lt;br&gt;&amp;nbsp; Kernel time: 0 days 0:04:23.000&lt;br&gt;&amp;nbsp; User time: 0 days 0:03:28.000&lt;/div&gt; &lt;p&gt;As you can see the system has been up for over 4 days. The process has been running for 24½ minutes and has an accumulated CPU-time of about 8 minutes total. This would give us an average CPU-usage for the process of around 32,5%&lt;/p&gt; &lt;h2&gt;!threadpool&lt;/h2&gt; &lt;p&gt;We can then use the !Threadpool-command to find out exactly what the CPU-usage was at the time the dump was taken. We'll also get some useful information like the number of work requests in the queue, completion port threads and timers.&lt;/p&gt; &lt;div class="DebugSample"&gt;0:000&amp;gt; !threadpool&lt;br&gt;CPU utilization 100%&lt;br&gt;Worker Thread: Total: 5 Running: 4 Idle: 1 MaxLimit: 200 MinLimit: 2&lt;br&gt;Work Request in Queue: 16&lt;br&gt;Unknown Function: 6a2d945d&amp;nbsp; Context: 023ede30&lt;br&gt;Unknown Function: 6a2d945d&amp;nbsp; Context: 023ee1e8&lt;br&gt;AsyncTimerCallbackCompletion TimerInfo@11b53760&lt;br&gt;Unknown Function: 6a2d945d&amp;nbsp; Context: 023ee3a8&lt;br&gt;Unknown Function: 6a2d945d&amp;nbsp; Context: 023e3040&lt;br&gt;Unknown Function: 6a2d945d&amp;nbsp; Context: 023ee178&lt;br&gt;Unknown Function: 6a2d945d&amp;nbsp; Context: 023edfb0&lt;br&gt;AsyncTimerCallbackCompletion TimerInfo@11b36428&lt;br&gt;AsyncTimerCallbackCompletion TimerInfo@11b53868&lt;br&gt;Unknown Function: 6a2d945d&amp;nbsp; Context: 023ee060&lt;br&gt;Unknown Function: 6a2d945d&amp;nbsp; Context: 023ee290&lt;br&gt;Unknown Function: 6a2d945d&amp;nbsp; Context: 023eded0&lt;br&gt;Unknown Function: 6a2d945d&amp;nbsp; Context: 023edd88&lt;br&gt;Unknown Function: 6a2d945d&amp;nbsp; Context: 023ede98&lt;br&gt;Unknown Function: 6a2d945d&amp;nbsp; Context: 023ee258&lt;br&gt;Unknown Function: 6a2d945d&amp;nbsp; Context: 023edfe8&lt;br&gt;--------------------------------------&lt;br&gt;Number of Timers: 9&lt;br&gt;--------------------------------------&lt;br&gt;Completion Port Thread:Total: 3 Free: 3 MaxFree: 4 CurrentLimit: 2 MaxLimit: 200 MinLimit: 2&lt;/div&gt; &lt;p&gt;So we can see that currently we're using 100% of the CPU, which leads us to the next command.&lt;/p&gt; &lt;h2&gt;!runaway&lt;/h2&gt; &lt;p&gt;This is a nice command that will list all running threads and their CPU-usage. It's your best friend when troubleshooting a high CPU hang issue. &lt;/p&gt; &lt;div class="DebugSample"&gt;0:000&amp;gt; !runaway&lt;br&gt;User Mode Time&lt;br&gt;&amp;nbsp; Thread&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Time&lt;br&gt;&amp;nbsp; 25:1a94&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 days 0:00:39.937&lt;br&gt;&amp;nbsp; 16:1bc0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 days 0:00:38.390&lt;br&gt;&amp;nbsp; 50:1e8c&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 days 0:00:08.859&lt;br&gt;&amp;nbsp; 52:1e40&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 days 0:00:08.687&lt;br&gt;&amp;nbsp; 20:1c2c&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 days 0:00:08.234&lt;br&gt;&amp;nbsp; 51:1340&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 days 0:00:08.171&lt;br&gt;&amp;nbsp; 21:1bcc&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 days 0:00:06.953&lt;br&gt;&amp;nbsp; 26:13ec&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 days 0:00:06.671&lt;br&gt;&amp;nbsp; 44:131c&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 days 0:00:03.906&lt;br&gt;&amp;nbsp; 22:d8c&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 days 0:00:03.375&lt;br&gt;&amp;nbsp; 33:78c&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 days 0:00:02.656&lt;br&gt;&amp;nbsp; 34:1a8c&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 days 0:00:00.906&lt;br&gt;&amp;nbsp; 29:1f5c&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 days 0:00:00.828&lt;br&gt;&amp;nbsp;&amp;nbsp; 6:e28&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 days 0:00:00.625&lt;br&gt;&amp;nbsp;&amp;nbsp; 5:1c78&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 days 0:00:00.546&lt;br&gt;&amp;nbsp; 23:14a4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 days 0:00:00.484&lt;br&gt;&amp;nbsp;&amp;nbsp; 4:5ac&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 days 0:00:00.437&lt;br&gt;&amp;nbsp; 45:5dc&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 days 0:00:00.421&lt;br&gt;&amp;nbsp;&amp;nbsp; 3:13b4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 days 0:00:00.421&lt;br&gt;&amp;nbsp; 47:19c8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 days 0:00:00.375&lt;br&gt;&amp;nbsp; 28:1b6c&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 days 0:00:00.250&lt;br&gt;&amp;nbsp; 46:1dac&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 days 0:00:00.156&lt;br&gt;&amp;nbsp;&amp;nbsp; 7:1dd8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 days 0:00:00.109&lt;br&gt;&amp;nbsp; 48:cdc&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 days 0:00:00.093&lt;br&gt;&amp;nbsp; 49:1eac&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 days 0:00:00.062&lt;br&gt;&amp;nbsp; 15:1a64&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 days 0:00:00.062&lt;br&gt;&amp;nbsp;&amp;nbsp; 0:1804&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 days 0:00:00.046&lt;br&gt;&amp;nbsp; 36:4a4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 days 0:00:00.031&lt;br&gt;&amp;nbsp; 11:1eb4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 days 0:00:00.031&lt;br&gt;&amp;nbsp;&amp;nbsp; 1:10b4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 days 0:00:00.031&lt;br&gt;&amp;nbsp; 31:16ac&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 days 0:00:00.015&lt;br&gt;&amp;nbsp; 14:4ac&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 days 0:00:00.015&lt;br&gt;&amp;nbsp;&amp;nbsp; 2:186c&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 days 0:00:00.015&lt;br&gt;&amp;nbsp; 59:590&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 days 0:00:00.000&lt;br&gt;&amp;nbsp; 58:294&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 days 0:00:00.000&lt;br&gt;&amp;nbsp; 57:16d0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 days 0:00:00.000&lt;br&gt;&amp;nbsp; 56:1578&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 days 0:00:00.000&lt;br&gt;&amp;nbsp; 55:1428&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 days 0:00:00.000&lt;br&gt;&amp;nbsp; 54:16d8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 days 0:00:00.000&lt;br&gt;&amp;nbsp; 53:fd8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 days 0:00:00.000&lt;br&gt;&amp;nbsp; 43:1b8c&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 days 0:00:00.000&lt;br&gt;&amp;nbsp; 42:1c24&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 days 0:00:00.000&lt;br&gt;&amp;nbsp; 41:1e2c&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 days 0:00:00.000&lt;br&gt;&amp;nbsp; 40:11b0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 days 0:00:00.000&lt;br&gt;&amp;nbsp; 39:edc&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 days 0:00:00.000&lt;br&gt;&amp;nbsp; 38:1a08&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 days 0:00:00.000&lt;br&gt;&amp;nbsp; 37:171c&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 days 0:00:00.000&lt;br&gt;&amp;nbsp; 35:1254&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 days 0:00:00.000&lt;br&gt;&amp;nbsp; 32:1f9c&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 days 0:00:00.000&lt;br&gt;&amp;nbsp; 30:1ae8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 days 0:00:00.000&lt;br&gt;&amp;nbsp; 27:190c&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 days 0:00:00.000&lt;br&gt;&amp;nbsp; 24:1d2c&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 days 0:00:00.000&lt;br&gt;&amp;nbsp; 19:1e38&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 days 0:00:00.000&lt;br&gt;&amp;nbsp; 18:ee4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 days 0:00:00.000&lt;br&gt;&amp;nbsp; 17:fb8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 days 0:00:00.000&lt;br&gt;&amp;nbsp; 13:1b54&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 days 0:00:00.000&lt;br&gt;&amp;nbsp; 12:1a48&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 days 0:00:00.000&lt;br&gt;&amp;nbsp; 10:f64&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 days 0:00:00.000&lt;br&gt;&amp;nbsp;&amp;nbsp; 9:1024&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 days 0:00:00.000&lt;br&gt;&amp;nbsp;&amp;nbsp; 8:1b78&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 days 0:00:00.000&lt;br&gt;&lt;/div&gt; &lt;p&gt;As you can see the total amount of time does &lt;em&gt;not&lt;/em&gt; match the total CPU utilization time that we got from the .time command. That's simply because threads get reused and recycled. This means that the total amount of CPU time used by a thread may have been split up over several page requests.&lt;/p&gt; &lt;h2&gt;!threads&lt;/h2&gt; &lt;p&gt;To get more information about the running threads we can run the !Threads-command. This will list all managed threads in the application, what application domain the thread is currently executing under, etc. The output will look like this:&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;div class="DebugSample"&gt;0:000&amp;gt; !threads&lt;br&gt;ThreadCount: 48&lt;br&gt;UnstartedThread: 0&lt;br&gt;BackgroundThread: 29&lt;br&gt;PendingThread: 0&lt;br&gt;DeadThread: 19&lt;br&gt;Hosted Runtime: no&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PreEmptive&amp;nbsp;&amp;nbsp; GC Alloc&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Lock&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ID OSID ThreadOBJ&amp;nbsp;&amp;nbsp;&amp;nbsp; State&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GC&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Context&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Domain&amp;nbsp;&amp;nbsp; Count APT Exception&lt;br&gt;&amp;nbsp; 16&amp;nbsp;&amp;nbsp;&amp;nbsp; 1 1bc0 001fccd0&amp;nbsp;&amp;nbsp; 1808220 Enabled&amp;nbsp; 00000000:00000000 0019daf0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 Ukn (Threadpool Worker)&lt;br&gt;&amp;nbsp; 22&amp;nbsp;&amp;nbsp;&amp;nbsp; 2&amp;nbsp; d8c 002016f0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; b220 Enabled&amp;nbsp; 00000000:00000000 0019daf0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 MTA (Finalizer)&lt;br&gt;&amp;nbsp; 14&amp;nbsp;&amp;nbsp;&amp;nbsp; 4&amp;nbsp; 4ac 00242e58&amp;nbsp;&amp;nbsp; 880a220 Enabled&amp;nbsp; 00000000:00000000 0019daf0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 MTA (Threadpool Completion Port)&lt;br&gt;&amp;nbsp; 23&amp;nbsp;&amp;nbsp;&amp;nbsp; 5 14a4 11b39f18&amp;nbsp;&amp;nbsp;&amp;nbsp; 80a220 Enabled&amp;nbsp; 00000000:00000000 0019daf0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 MTA (Threadpool Completion Port)&lt;br&gt;&amp;nbsp; 24&amp;nbsp;&amp;nbsp;&amp;nbsp; 6 1d2c 11b41ad8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1220 Enabled&amp;nbsp; 00000000:00000000 0019daf0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 Ukn&lt;br&gt;&amp;nbsp; 25&amp;nbsp;&amp;nbsp;&amp;nbsp; 7 1a94 11b46c70&amp;nbsp;&amp;nbsp; 180b220 Enabled&amp;nbsp; 27240c98:27241fd8 11b42540&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1 MTA (Threadpool Worker)&lt;br&gt;&amp;nbsp; 26&amp;nbsp;&amp;nbsp;&amp;nbsp; 9 13ec 12ce2888&amp;nbsp;&amp;nbsp; 200b220 Enabled&amp;nbsp; 2a9f1434:2a9f33c0 11b42540&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 MTA&lt;br&gt;&amp;nbsp; 27&amp;nbsp;&amp;nbsp;&amp;nbsp; a 190c 12d85eb8&amp;nbsp;&amp;nbsp; 200b220 Enabled&amp;nbsp; 00000000:00000000 11b42540&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 MTA&lt;br&gt;&amp;nbsp; 29&amp;nbsp;&amp;nbsp;&amp;nbsp; b 1f5c 13df6a50&amp;nbsp;&amp;nbsp; 200b220 Enabled&amp;nbsp; 2ab1da6c:2ab1f1c0 11b42540&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 MTA&lt;br&gt;&amp;nbsp; 30&amp;nbsp;&amp;nbsp;&amp;nbsp; c 1ae8 12d44a58&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; b220 Enabled&amp;nbsp; 00000000:00000000 11b42540&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 MTA&lt;br&gt;&amp;nbsp; 31&amp;nbsp;&amp;nbsp;&amp;nbsp; d 16ac 12e2e008&amp;nbsp;&amp;nbsp; 200b220 Enabled&amp;nbsp; 2a81348c:2a8153c0 11b42540&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1 MTA&lt;br&gt;&amp;nbsp;&amp;nbsp; 5&amp;nbsp;&amp;nbsp;&amp;nbsp; e 1c78 12da2160&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 220 Enabled&amp;nbsp; 00000000:00000000 0019daf0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 Ukn&lt;br&gt;&amp;nbsp; 33&amp;nbsp;&amp;nbsp;&amp;nbsp; 8&amp;nbsp; 78c 11b674c8&amp;nbsp;&amp;nbsp; 200b220 Enabled&amp;nbsp; 2707b818:2707c1d8 11b42540&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 MTA&lt;br&gt;&amp;nbsp; 34&amp;nbsp;&amp;nbsp; 12 1a8c 13f163c8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 220 Enabled&amp;nbsp; 00000000:00000000 0019daf0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 Ukn&lt;br&gt;&amp;nbsp; 36&amp;nbsp;&amp;nbsp; 13&amp;nbsp; 4a4 13eef718&amp;nbsp;&amp;nbsp; 200b220 Enabled&amp;nbsp; 2a7db4a4:2a7dd3c0 11b42540&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 MTA&lt;br&gt;&amp;nbsp;&amp;nbsp; 4&amp;nbsp;&amp;nbsp; 14&amp;nbsp; 5ac 13ef2008&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 220 Enabled&amp;nbsp; 00000000:00000000 0019daf0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 Ukn&lt;br&gt;&amp;nbsp; 42&amp;nbsp;&amp;nbsp; 10 1c24 13f0e950&amp;nbsp;&amp;nbsp; 880b220 Enabled&amp;nbsp; 00000000:00000000 0019daf0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 MTA (Threadpool Completion Port)&lt;br&gt;&amp;nbsp;&amp;nbsp; 6&amp;nbsp;&amp;nbsp; 11&amp;nbsp; e28 13f16008&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 220 Enabled&amp;nbsp; 00000000:00000000 0019daf0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 Ukn&lt;br&gt;&amp;nbsp;&amp;nbsp; 3&amp;nbsp;&amp;nbsp;&amp;nbsp; f 13b4 13eba008&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 220 Enabled&amp;nbsp; 00000000:00000000 0019daf0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 Ukn&lt;br&gt;&amp;nbsp; 43&amp;nbsp;&amp;nbsp; 15 1b8c 140db008&amp;nbsp;&amp;nbsp; 880b220 Enabled&amp;nbsp; 00000000:00000000 0019daf0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 MTA (Threadpool Completion Port)&lt;br&gt;&amp;nbsp; 44&amp;nbsp;&amp;nbsp; 17 131c 140ceb28&amp;nbsp;&amp;nbsp; 200b220 Enabled&amp;nbsp; 272288c8:27229fd8 11b42540&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 MTA&lt;br&gt;&amp;nbsp; 45&amp;nbsp;&amp;nbsp; 1d&amp;nbsp; 5dc 140cd0a0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 220 Enabled&amp;nbsp; 00000000:00000000 0019daf0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 Ukn&lt;br&gt;&amp;nbsp; 47&amp;nbsp;&amp;nbsp; 20 19c8 1651a008&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 220 Enabled&amp;nbsp; 00000000:00000000 0019daf0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 Ukn&lt;br&gt;XXXX&amp;nbsp;&amp;nbsp; 24&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 16468880&amp;nbsp;&amp;nbsp; 1801820 Enabled&amp;nbsp; 00000000:00000000 0019daf0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 Ukn (Threadpool Worker)&lt;br&gt;&amp;nbsp; 46&amp;nbsp;&amp;nbsp; 1f 1dac 1650ab48&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 220 Enabled&amp;nbsp; 00000000:00000000 0019daf0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 Ukn&lt;br&gt;XXXX&amp;nbsp;&amp;nbsp; 1a&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 140d5008&amp;nbsp;&amp;nbsp; 1801820 Enabled&amp;nbsp; 00000000:00000000 0019daf0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 Ukn (Threadpool Worker)&lt;br&gt;XXXX&amp;nbsp;&amp;nbsp; 16&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 140c5008&amp;nbsp;&amp;nbsp; 1801820 Enabled&amp;nbsp; 00000000:00000000 0019daf0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 Ukn (Threadpool Worker)&lt;br&gt;&amp;nbsp; 50&amp;nbsp;&amp;nbsp;&amp;nbsp; 3 1e8c 14064420&amp;nbsp;&amp;nbsp; 180b220 Enabled&amp;nbsp; 27246f54:27247fd8 11b42540&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1 MTA (Threadpool Worker)&lt;br&gt;XXXX&amp;nbsp;&amp;nbsp; 35&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 1406e800&amp;nbsp;&amp;nbsp; 1801820 Enabled&amp;nbsp; 00000000:00000000 0019daf0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 Ukn (Threadpool Worker)&lt;br&gt;&amp;nbsp; 51&amp;nbsp;&amp;nbsp; 36 1340 140df008&amp;nbsp;&amp;nbsp; 180b220 Enabled&amp;nbsp; 2adec9cc:2aded1c0 11b42540&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1 MTA (Threadpool Worker)&lt;br&gt;XXXX&amp;nbsp;&amp;nbsp; 37&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 16566868&amp;nbsp;&amp;nbsp; 1801820 Enabled&amp;nbsp; 00000000:00000000 0019daf0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 Ukn (Threadpool Worker)&lt;br&gt;&amp;nbsp; 48&amp;nbsp;&amp;nbsp; 38&amp;nbsp; cdc 16578840&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 220 Enabled&amp;nbsp; 00000000:00000000 0019daf0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 Ukn&lt;br&gt;XXXX&amp;nbsp;&amp;nbsp; 39&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 16566c28&amp;nbsp;&amp;nbsp; 1801820 Enabled&amp;nbsp; 00000000:00000000 0019daf0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 Ukn (Threadpool Worker)&lt;br&gt;XXXX&amp;nbsp;&amp;nbsp; 3b&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 1646b8b0&amp;nbsp;&amp;nbsp; 1801820 Enabled&amp;nbsp; 00000000:00000000 0019daf0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 Ukn (Threadpool Worker)&lt;br&gt;XXXX&amp;nbsp;&amp;nbsp; 3c&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 16674008&amp;nbsp;&amp;nbsp; 1801820 Enabled&amp;nbsp; 00000000:00000000 0019daf0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 Ukn (Threadpool Worker)&lt;br&gt;XXXX&amp;nbsp;&amp;nbsp; 3d&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 16676418&amp;nbsp;&amp;nbsp; 1801820 Enabled&amp;nbsp; 00000000:00000000 0019daf0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 Ukn (Threadpool Worker)&lt;br&gt;XXXX&amp;nbsp;&amp;nbsp; 3e&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 16676fb8&amp;nbsp;&amp;nbsp; 1801820 Enabled&amp;nbsp; 00000000:00000000 0019daf0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 Ukn (Threadpool Worker)&lt;br&gt;XXXX&amp;nbsp;&amp;nbsp; 3f&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 16674d48&amp;nbsp;&amp;nbsp; 1801820 Enabled&amp;nbsp; 00000000:00000000 0019daf0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 Ukn (Threadpool Worker)&lt;br&gt;XXXX&amp;nbsp;&amp;nbsp; 40&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 1667de10&amp;nbsp;&amp;nbsp; 1801820 Enabled&amp;nbsp; 00000000:00000000 0019daf0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 Ukn (Threadpool Worker)&lt;br&gt;XXXX&amp;nbsp;&amp;nbsp; 41&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 16680050&amp;nbsp;&amp;nbsp; 1801820 Enabled&amp;nbsp; 00000000:00000000 0019daf0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 Ukn (Threadpool Worker)&lt;br&gt;XXXX&amp;nbsp;&amp;nbsp; 42&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 166812e8&amp;nbsp;&amp;nbsp; 1801820 Enabled&amp;nbsp; 00000000:00000000 0019daf0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 Ukn (Threadpool Worker)&lt;br&gt;XXXX&amp;nbsp;&amp;nbsp; 43&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 16683e60&amp;nbsp;&amp;nbsp; 1801820 Enabled&amp;nbsp; 00000000:00000000 0019daf0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 Ukn (Threadpool Worker)&lt;br&gt;&amp;nbsp; 52&amp;nbsp;&amp;nbsp; 44 1e40 165259e8&amp;nbsp;&amp;nbsp; 180b220 Enabled&amp;nbsp; 2adf126c:2adf31c0 11b42540&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1 MTA (Threadpool Worker)&lt;br&gt;XXXX&amp;nbsp;&amp;nbsp; 45&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 165b7c08&amp;nbsp;&amp;nbsp; 1801820 Enabled&amp;nbsp; 00000000:00000000 0019daf0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 Ukn (Threadpool Worker)&lt;br&gt;XXXX&amp;nbsp;&amp;nbsp; 46&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 165aa3d8&amp;nbsp;&amp;nbsp; 1801820 Enabled&amp;nbsp; 00000000:00000000 0019daf0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 Ukn (Threadpool Worker)&lt;br&gt;XXXX&amp;nbsp;&amp;nbsp; 47&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 165242c8&amp;nbsp;&amp;nbsp; 1801820 Enabled&amp;nbsp; 00000000:00000000 0019daf0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 Ukn (Threadpool Worker)&lt;br&gt;XXXX&amp;nbsp;&amp;nbsp; 48&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 165e9500&amp;nbsp;&amp;nbsp; 1801820 Enabled&amp;nbsp; 00000000:00000000 0019daf0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 Ukn (Threadpool Worker)&lt;br&gt;&amp;nbsp; 49&amp;nbsp;&amp;nbsp; 3a 1eac 165676f0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 220 Enabled&amp;nbsp; 00000000:00000000 0019daf0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 Ukn&amp;nbsp;&lt;br&gt;&lt;/div&gt; &lt;p&gt;The threads with an ID of XXXX have ended and are waiting to be recycled. We can also see that the finalizer thread has an ID of 22. So if we'd seen an unhealthy amount of activity on thread 22 when we ran the !runaway-command we would now have known that we had a finalizer-issue on our hands. &lt;/p&gt; &lt;h2&gt;Switching to a specific thread&lt;/h2&gt; &lt;p&gt;To go to a specific thread we use the ~-command. The syntax is as follows: ~[number of thread]s. So to switch to thread 50 we would type the following:&lt;/p&gt; &lt;div class="DebugSample"&gt;0:000&amp;gt; ~50s&lt;br&gt;&lt;/div&gt; &lt;p&gt;We have then switched to thread 50, and can use a lot of other useful commands.&lt;/p&gt; &lt;h2&gt;!clrstack&lt;/h2&gt; &lt;p&gt;This great command will list the callstack for the current thread. If you want additional information you can add the "-p" switch which will show you parameters and local variables as well.&lt;/p&gt; &lt;p&gt;Below is a sample listing of the clrstack for thread 50.&lt;/p&gt; &lt;div class="DebugSample"&gt;0:050&amp;gt; !clrstack&lt;br&gt;OS Thread Id: 0x1e8c (50)&lt;br&gt;ESP&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EIP&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;17a9e750 7d61c828 [NDirectMethodFrameSlim: 17a9e750] System.DirectoryServices.Protocols.Wldap32.ldap_bind_s(IntPtr, System.String, System.DirectoryServices.Protocols.SEC_WINNT_AUTH_IDENTITY_EX, System.DirectoryServices.Protocols.BindMethod)&lt;br&gt;17a9e768 14df70f9 System.DirectoryServices.Protocols.LdapConnection.BindHelper(System.Net.NetworkCredential, Boolean)&lt;br&gt;17a9e794 14df6de0 System.DirectoryServices.Protocols.LdapConnection.Bind()&lt;br&gt;17a9e79c 14df59e9 System.DirectoryServices.Protocols.LdapConnection.SendRequestHelper(System.DirectoryServices.Protocols.DirectoryRequest, Int32 ByRef)&lt;br&gt;17a9e8b8 14df56e8 System.DirectoryServices.Protocols.LdapConnection.SendRequest(System.DirectoryServices.Protocols.DirectoryRequest, System.TimeSpan)&lt;br&gt;17a9e8bc 14df5657 [InlinedCallFrame: 17a9e8bc]&lt;/div&gt; &lt;p&gt;So, reading from the bottom up we can see that an LdapConnection called the SendRequest method, which in turn called the SendRequestHelper method, which called the Bind method, and so on.&lt;/p&gt; &lt;p&gt;If we run !clrstack -p we get the following:&lt;/p&gt; &lt;div class="DebugSample"&gt;0:050&amp;gt; !clrstack -p&lt;br&gt;OS Thread Id: 0x1e8c (50)&lt;br&gt;ESP&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EIP&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;17a9e750 7d61c828 [NDirectMethodFrameSlim: 17a9e750] System.DirectoryServices.Protocols.Wldap32.ldap_bind_s(IntPtr, System.String, System.DirectoryServices.Protocols.SEC_WINNT_AUTH_IDENTITY_EX, System.DirectoryServices.Protocols.BindMethod)&lt;br&gt;17a9e768 14df70f9 System.DirectoryServices.Protocols.LdapConnection.BindHelper(System.Net.NetworkCredential, Boolean)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PARAMETERS:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this = 0x271fdfe0&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; newCredential = &lt;no data&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; needSetCredential = &lt;no data&gt;&lt;br&gt;&lt;br&gt;17a9e794 14df6de0 System.DirectoryServices.Protocols.LdapConnection.Bind()&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PARAMETERS:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this = &lt;no data&gt;&lt;br&gt;&lt;br&gt;17a9e79c 14df59e9 System.DirectoryServices.Protocols.LdapConnection.SendRequestHelper(System.DirectoryServices.Protocols.DirectoryRequest, Int32 ByRef)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PARAMETERS:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this = 0x271fdfe0&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; request = &lt;font color="#ff0000"&gt;0x27246e38&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; messageID = 0x17a9e8ec&lt;br&gt;&lt;br&gt;17a9e8b8 14df56e8 System.DirectoryServices.Protocols.LdapConnection.SendRequest(System.DirectoryServices.Protocols.DirectoryRequest, System.TimeSpan)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PARAMETERS:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this = 0x271fdfe0&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; request = &lt;font color="#ff0000"&gt;0x27246e38&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; requestTimeout = &lt;no data&gt;&lt;br&gt;&lt;br&gt;17a9e8bc 14df5657 [InlinedCallFrame: 17a9e8bc] &lt;br&gt;&lt;/div&gt; &lt;p&gt;We can now look at the parameters, like the DirectoryRequest that was sent to the SendRequest and SendRequestHelper methods. To do this we simply copy the address of the request, (0x27246e38) and use it as an argument for our next command.&lt;/p&gt; &lt;h2&gt;!dumpobject (!do)&lt;/h2&gt; &lt;p&gt;This is another crucial command. Dumpobject will dump the object at the specified address, so if we send the address of the request as a parameter we will get the request dumped to screen.:&lt;/p&gt; &lt;div class="DebugSample"&gt;0:050&amp;gt; !do 0x27246e38&lt;br&gt;Name: System.DirectoryServices.Protocols.SearchRequest&lt;br&gt;MethodTable: 14b394c4&lt;br&gt;EEClass: 14d97ce0&lt;br&gt;Size: 52(0x34) bytes&lt;br&gt;GC Generation: 0&lt;br&gt;(C:\WINDOWS\assembly\GAC_MSIL\System.DirectoryServices.Protocols\2.0.0.0__b03f5f7f11d50a3a\System.DirectoryServices.Protocols.dll)&lt;br&gt;Fields:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MT&amp;nbsp;&amp;nbsp;&amp;nbsp; Field&amp;nbsp;&amp;nbsp; Offset&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Type VT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Attr&amp;nbsp;&amp;nbsp;&amp;nbsp; Value Name&lt;br&gt;02c39310&amp;nbsp; 4000102&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.String&amp;nbsp; 0 instance 00000000 directoryRequestID&lt;br&gt;14b398bc&amp;nbsp; 4000103&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 8 ...ControlCollection&amp;nbsp; 0 instance 27246e90 directoryControlCollection&lt;br&gt;02c39310&amp;nbsp; 4000111&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; c&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#ff0000"&gt;System.String&lt;/font&gt;&amp;nbsp; 0 instance &lt;font color="#ff0000"&gt;27246d00&lt;/font&gt; &lt;font color="#ff0000"&gt;dn&lt;/font&gt;&lt;br&gt;12579f5c&amp;nbsp; 4000112&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 10 ....StringCollection&amp;nbsp; 0 instance 27246eb4 directoryAttributes&lt;br&gt;02c36ca0&amp;nbsp; 4000113&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 14&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Object&amp;nbsp; 0 instance 27246ddc directoryFilter&lt;br&gt;14b39344&amp;nbsp; 4000114&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 18&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Int32&amp;nbsp; 1 instance&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1 directoryScope&lt;br&gt;14b393fc&amp;nbsp; 4000115&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1c&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Int32&amp;nbsp; 1 instance&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 directoryRefAlias&lt;br&gt;0fd3da00&amp;nbsp; 4000116&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 20&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Int32&amp;nbsp; 1 instance&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 directorySizeLimit&lt;br&gt;1202af88&amp;nbsp; 4000117&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 28&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.TimeSpan&amp;nbsp; 1 instance 27246e60 directoryTimeLimit&lt;br&gt;120261c8&amp;nbsp; 4000118&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 24&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Boolean&amp;nbsp; 1 instance&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 directoryTypesOnly&lt;br&gt;&lt;/div&gt; &lt;p&gt;Okay, so what's this? Well, it's a System.DirectoryServices.Protocols.SearchRequest object. This means that it has various properties defined by the System.DirectoryServices.Protocols.SearchRequest class. If you want to know more about these properties I suggest you&amp;nbsp;&lt;a href="http://msdn2.microsoft.com/en-us/library/system.directoryservices.protocols.searchrequest_properties.aspx"&gt;look up the SearchRequest class in msdn&lt;/a&gt;. We have the RequestId, the Scope, the DistinguishedName, etc.&lt;/p&gt; &lt;p&gt;So, let's say we want to know what the distinguished name is for this particular request. We boldly assume that the dn-property we see in the listing above is what is called DistinguishedName by MSDN. Simply copy the address of the dn-property (27246d00) and use !dumpobject again. We can see that the property is a System.String, so the output should be pretty clear.&lt;/p&gt; &lt;div class="DebugSample"&gt;0:050&amp;gt; !do 27246d00 &lt;br&gt;Name: System.String&lt;br&gt;MethodTable: 02c39310&lt;br&gt;EEClass: 0fb610ac&lt;br&gt;Size: 112(0x70) bytes&lt;br&gt;GC Generation: 0&lt;br&gt; (C:\WINDOWS\assembly\GAC_32\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll)&lt;br&gt;String: &lt;font color="#ff0000"&gt;CN=Dummy,CN=Accounts,CN=useradm,DC=dummy,DC=net&lt;/font&gt;&lt;br&gt;Fields:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MT&amp;nbsp;&amp;nbsp;&amp;nbsp; Field&amp;nbsp;&amp;nbsp; Offset&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Type VT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Attr&amp;nbsp;&amp;nbsp;&amp;nbsp; Value Name&lt;br&gt;0fd3da00&amp;nbsp; 4000096&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Int32&amp;nbsp; 1 instance&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 48 m_arrayLength&lt;br&gt;0fd3da00&amp;nbsp; 4000097&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Int32&amp;nbsp; 1 instance&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 47 m_stringLength&lt;br&gt;0fb80010&amp;nbsp; 4000098&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; c&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Char&amp;nbsp; 1 instance&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 43 m_firstChar&lt;br&gt;02c39310&amp;nbsp; 4000099&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 10&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.String&amp;nbsp; 0&amp;nbsp;&amp;nbsp; shared&amp;nbsp;&amp;nbsp; static Empty&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;gt;&amp;gt; Domain:Value&amp;nbsp; 0019daf0:03380310 11b42540:03380310 &amp;lt;&amp;lt;&lt;br&gt;0fb86d44&amp;nbsp; 400009a&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 14&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Char[]&amp;nbsp; 0&amp;nbsp;&amp;nbsp; shared&amp;nbsp;&amp;nbsp; static WhitespaceChars&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;gt;&amp;gt; Domain:Value&amp;nbsp; 0019daf0:03380324 11b42540:033855bc &amp;lt;&amp;lt;&lt;br&gt;&lt;/div&gt; &lt;p&gt;Apparently, the distinguished name used was "CN=Dummy,CN=Accounts,CN=useradm,DC=dummy,DC=net". If we want to find out more we simply continue using !dumpobject to examine the objects and their respective values.&lt;/p&gt; &lt;p&gt;In my next post I thought I'd continue using the !dumpobject-command to probe through the w3wp-process, and introduce a couple of other great commands.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;To be continued...&lt;/p&gt; &lt;p&gt;/ Johan&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=6174183" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/johan/archive/tags/WinDbg/default.aspx">WinDbg</category><category domain="http://blogs.msdn.com/johan/archive/tags/Tools/default.aspx">Tools</category><category domain="http://blogs.msdn.com/johan/archive/tags/Debugging+School/default.aspx">Debugging School</category><category domain="http://blogs.msdn.com/johan/archive/tags/ASP.NET/default.aspx">ASP.NET</category></item><item><title>How to install Windbg and get your first memory dump</title><link>http://blogs.msdn.com/johan/archive/2007/01/11/how-to-install-windbg-and-get-your-first-memory-dump.aspx</link><pubDate>Thu, 11 Jan 2007 19:42:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:1451020</guid><dc:creator>JohanS</dc:creator><slash:comments>11</slash:comments><comments>http://blogs.msdn.com/johan/comments/1451020.aspx</comments><wfw:commentRss>http://blogs.msdn.com/johan/commentrss.aspx?PostID=1451020</wfw:commentRss><description>&lt;H1&gt;Install Windbg&lt;/H1&gt;
&lt;P&gt;Windbg is &lt;EM&gt;the&lt;/EM&gt; tool for the ASP.NET support engineer. It is free and it's available at &lt;A href="http://www.microsoft.com/whdc/devtools/debugging/default.mspx" target=_blank mce_href="http://www.microsoft.com/whdc/devtools/debugging/default.mspx"&gt;www.microsoft.com/whdc/devtools/debugging/default.mspx&lt;/A&gt;. The learning curve is steep to say the least, but if you're interested in finding out what is going on behind the scenes in your application, then Windbg is your new best friend. For information on how to configure windbg, please refer to the documentation. Pay special attention to the section concerning symbols.&lt;/P&gt;
&lt;P&gt;There is an extension called SOS.dll that you will want to use. You'll find it in the framework directory so for Framework 2.0 look in "C:\Windows\Microsoft.NET\Framework\v2.0.50727". You might want to copy it into the same folder as windbg for easy access.&lt;/P&gt;
&lt;H1&gt;Get a memory dump&lt;/H1&gt;
&lt;P&gt;Windbg will allow you to either perform a post mortem analysis on a memory dump or to attach to a process during execution. I mainly deal with memory dumps, since it's a lot easier to request a single file from a customer rather than access to their server. Maybe I'll cover live debugging in another post, but for now we'll just look at dump files.&lt;/P&gt;
&lt;H2&gt;Vista&lt;/H2&gt;
&lt;P&gt;If you're running Windows Vista, then you can easily create a dump file from the task manager. Simply open up the "Processes"-tab, right-click the process you wish to dump&amp;nbsp;and select "Create Dump File".&lt;/P&gt;
&lt;H2&gt;Adplus&lt;/H2&gt;
&lt;P&gt;For any other system or if you want to specify certain conditions I'd recommend using a script called adplus. It comes with the Windbg installation and is run from the command prompt. Adplus will take a number of arguments, but for basic operation there are two things you need to specify:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;When to take the dump 
&lt;LI&gt;The name or process ID&amp;nbsp;of the process you wish to take a dump of&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;The dumps generated by adplus will be saved to a subfolder of the folder where you've installed windbg.&lt;/P&gt;
&lt;P&gt;For example:&lt;/P&gt;
&lt;DIV class=SampleCode&gt;adplus -crash -pn w3wp.exe&lt;/DIV&gt;
&lt;P&gt;This will generate a full memory dump right before any process named w3wp.exe terminates or recycles. This will also generate minidumps on all first chance exceptions.&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class=SampleCode&gt;adplus -crash -pn w3wp.exe -NoDumpOnFirst&lt;/DIV&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Same as above, but without the minidumps.&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class=SampleCode&gt;adplus -hang -p 2960&lt;/DIV&gt;
&lt;P&gt;This will immediately get a full dump of the process with ID 2960. Commonly used when the process has hung, or is generally unresponsive. Hence the name.&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2&gt;Advanced Adplus&lt;/H2&gt;
&lt;P&gt;If you're trying to pin down the cause of a specific exception, then you can use a config file. This is a sample config file that will create a full memory dump once a System.Runtime.InteropServices.COMException occurs. Simply copy the code below into notepad and save it as MyConfig.cfg.&lt;/P&gt;
&lt;DIV class=SampleCode&gt;&amp;lt;ADPlus&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;lt;Settings&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;RunMode&amp;gt; CRASH &amp;lt;/RunMode&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;lt;/Settings&amp;gt; &amp;nbsp;&amp;lt;PreCommands&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;Cmd&amp;gt; !load clr10\sos&amp;lt;/Cmd&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;lt;/PreCommands&amp;gt; &amp;nbsp;&amp;lt;Exceptions&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;Option&amp;gt; NoDumpOnFirstChance &amp;lt;/Option&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;Option&amp;gt; NoDumpOnSecondChance &amp;lt;/Option&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;Config&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;!-- This is for the CLR exception --&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Code&amp;gt; clr &amp;lt;/Code&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;Actions1&amp;gt; Log &amp;lt;/Actions1&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;CustomActions1&amp;gt; !clr10\sos.cce System.Runtime.InteropServices.COMException 1; j ($t1 = 1) '.dump /ma /u c:\dumps\exceptiondump.dmp;gn' ; 'gn' &amp;lt;/CustomActions1&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;ReturnAction1&amp;gt; GN &amp;lt;/ReturnAction1&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;Actions2&amp;gt; Void &amp;lt;/Actions2&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;ReturnAction2&amp;gt; GN &amp;lt;/ReturnAction2&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;/Config&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;lt;/Exceptions&amp;gt;&lt;BR&gt;&amp;lt;/ADPlus&amp;gt;&lt;/DIV&gt;
&lt;P&gt;As you can see you can easily adjust the config so that it gets a dump on any other exception. The dump will be saved in c:\dumps, so you should also make sure that this folder exists. When you're ready, run adplus with the following syntax:&lt;/P&gt;
&lt;DIV class=SampleCode&gt;adplus -c myconfig.cfg -pn w3wp.exe&lt;/DIV&gt;
&lt;H2&gt;&amp;nbsp;&amp;nbsp;&lt;/H2&gt;
&lt;H2&gt;Debugging through a Terminal Server session&lt;/H2&gt;
&lt;P&gt;If you don't have direct access to the server you need to either attach noninvasively or schedule the command you wish to run. This can seem&amp;nbsp; a bit complicated, but there's a pretty good howto written in the knowledge base under the following article: &lt;A class="" title=323478 href="http://support.microsoft.com/default.aspx/kb/323478" target=_blank mce_href="http://support.microsoft.com/default.aspx/kb/323478"&gt;http://support.microsoft.com/default.aspx/kb/323478&lt;/A&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;Well I guess that's all for now.&lt;/P&gt;
&lt;P&gt;/ Johan&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=1451020" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/johan/archive/tags/WinDbg/default.aspx">WinDbg</category><category domain="http://blogs.msdn.com/johan/archive/tags/Adplus/default.aspx">Adplus</category><category domain="http://blogs.msdn.com/johan/archive/tags/Debugging+School/default.aspx">Debugging School</category><category domain="http://blogs.msdn.com/johan/archive/tags/ASP.NET/default.aspx">ASP.NET</category></item></channel></rss>