title: How to see friendly .NET call stacks?
body: <p>I got a memory dump. I can get the normal callstack (with line number)
  When I use Debug Diag to analyze the dump I got this callstack on thread 62.</p>
  
  <pre><code>.NET Call Stack
  
  [[HelperMethodFrame_1OBJ] (System.Threading.WaitHandle.WaitOneNative)] System.Threading.WaitHandle.WaitOneNative(System.Runtime.InteropServices.SafeHandle, UInt32, Boolean, Boolean) 
  mscorlib_ni!System.Threading.WaitHandle.InternalWaitOne(System.Runtime.InteropServices.SafeHandle, Int64, Boolean, Boolean)+21 
  mscorlib_ni!System.Threading.WaitHandle.WaitOne(Int32, Boolean)+31 
  CaptureServices.GenericInfrastructure.ExportLogic.ChannelsThread.ChannelsStateThread()+bb 
  mscorlib_ni!System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)+15e 
  mscorlib_ni!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)+17 
  mscorlib_ni!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)+52 
  mscorlib_ni!System.Threading.ThreadHelper.ThreadStart()+52 
  [[GCFrame]] 
  [[DebuggerU2MCatchHandlerFrame]] 
  </code></pre>
  
  <p>As I understand .NET has some mechanism to shows human readable names instead of adresses. Now I want this line in WinDbg:</p>
  
  <pre><code>CaptureUtilities.AudioProcessing.APProcessorThread.IterateAPStreamProcessorQueue()+49 
  </code></pre>
  
  <p>I open WinDbg and load the dump. I execute <code>~62 k</code> and get</p>
  
  <pre><code>Child-SP          RetAddr           Call Site
  00000016`4965e0c8 00007ffc`b59113ed ntdll!NtWaitForMultipleObjects+0xa
  00000016`4965e0d0 00007ffc`abde77be KERNELBASE!WaitForMultipleObjectsEx+0xe1
  00000016`4965e3b0 00007ffc`abde7658 clr!WaitForMultipleObjectsEx_SO_TOLERANT+0x62
  00000016`4965e410 00007ffc`abde7451 clr!Thread::DoAppropriateWaitWorker+0x1e4
  00000016`4965e510 00007ffc`abdebd15 clr!Thread::DoAppropriateWait+0x7d
  00000016`4965e590 00007ffc`a94ecdf1 clr!WaitHandleNative::CorWaitOneNative+0x165
  00000016`4965e7c0 00007ffc`a94ecdc1 mscorlib_ni+0x48cdf1
  00000016`4965e7f0 00007ffc`4cf2e97b mscorlib_ni+0x48cdc1
  00000016`4965e830 00007ffc`a94e674e 0x00007ffc`4cf2e97b
  00000016`4965e890 00007ffc`a94e65e7 mscorlib_ni+0x48674e
  00000016`4965e960 00007ffc`a94e65a2 mscorlib_ni+0x4865e7
  00000016`4965e990 00007ffc`a94ed1f2 mscorlib_ni+0x4865a2
  00000016`4965e9e0 00007ffc`abc36a53 mscorlib_ni+0x48d1f2
  00000016`4965ea20 00007ffc`abc36913 clr!CallDescrWorkerInternal+0x83
  </code></pre>
  
  <p>Ok, as I understand it is the same. Now we have </p>
  
  <pre><code>0x00007ffc`4cf2e97b
  </code></pre>
  
  <p>instead of</p>
  
  <pre><code>CaptureServices.GenericInfrastructure.ExportLogic.ChannelsThread.ChannelsStateThread()+bb 
  </code></pre>
  
  <p>So I have Microsoft debug symbols, now I need to load my own symbols to see the callstack.
  The question is - do I need to load all debug symbols for my projects or I need only debug symbols for dll which contains <code>CaptureServices.GenericInfrastructure.ExportLogic</code>?
  Or maybe I need to load only part of my debug symbols to handle this thread?</p>