2017-03-14 59 views
1

我得到了內存轉儲。我能得到正常的調用堆棧(行號) 當我使用調試診斷據我瞭解.NET有一些機制來分析我上線62如何查看友好的.NET調用堆棧?

.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]] 

這個調用堆棧轉儲到展示,而不是人類可讀的名字的地址。現在我想在WinDbg中使用這一行:

CaptureUtilities.AudioProcessing.APProcessorThread.IterateAPStreamProcessorQueue()+49 

我打開WinDbg並加載轉儲。我執行~62 k並得到

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 

好的,據我所知它是相同的。現在我們有

0x00007ffc`4cf2e97b 

,而不是

CaptureServices.GenericInfrastructure.ExportLogic.ChannelsThread.ChannelsStateThread()+bb 

所以我對微軟的調試符號,現在我需要加載我自己的符號看到調用堆棧。 問題是 - 我是否需要爲我的項目加載所有調試符號,或者我只需要調試包含CaptureServices.GenericInfrastructure.ExportLogic的dll的符號? 或者也許我只需要加載一部分調試符號來處理這個線程?

+1

你從哪裏得到'IterateAPStreamProcessorQueue'?它不在調用堆棧 –

回答

-1

您需要函數所屬庫的調試符號。

+0

就像我看不到混淆,如果你想要一個可執行文件的符號數據,你需要它的符號數據庫(通常是Windows中的.pdb)。什麼是在這裏扔你一個循環? – Blindy

+0

也許簡單的例子會顯示我的困惑。 讓我的項目有3個DLL(A,D,C) 我知道在這個線程中,我卡在代碼A中。代碼B和C中調用的A代碼是獨立的(不是此調用堆棧的一部分,但是部分其他調用堆棧) 哪些DLL需要查看callstack A,A + B,A + B + C? –

+0

您是否意識到這是針對.NET而不是本地代碼的?這並不像加載PDB文件那麼簡單。 WinDbg無法自行調試.NET。 –

0

~62k中的k命令是本機調用堆棧的命令。它可以顯示任何.NET的東西(除了在clr.dll中的本地方法)。

要看到.NET堆棧,你需要加載.NET擴展WinDbg中:

.loadby sos clr 

,然後使用該擴展的命令來查看.NET調用堆棧。先切換到線程

~62s 
!clrstack 
!dumpstack 

恕我直言,那些命令將在需要時從PDB加載符號。如果您收到符號警告,請參閱How to fix symbols in WinDbg

1

嘗試!sosex.mk。它提供了一個用戶友好的堆棧跟蹤與交錯託管和本地幀。我不認爲這是一個符號問題。此外,如果您擁有託管地址,則可以將其傳遞到!sosex.mln以查看位於那裏的內容,但我認爲您已經知道此命令。