2017-03-14 11 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 

[OK]を取得します。今、私たちは

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、A + B、A + B + Cを見るのに必要なDLLはどれですか? –

+0

これは.NET用でネイティブコード用ではないことに気付きましたか? PDBファイルをロードするのと同じくらい簡単ではありません。 WinDbgは単独で.NETをデバッグできません。 –

0

~62kのようなkコマンドは、ネイティブコールスタックのコマンドです。これは、.NETのものをすべて網羅しています(clr.dllのネイティブメソッドを除く)。 .NETスタックを表示するには

、あなたはWinDbgのための.NET拡張をロードする必要があります。

.loadby sos clr 

をそして.NETのコールスタックを見るためにその拡張子のコマンドを使用します。スレッド62に最初に切り替えます。

~62s 
!clrstack 
!dumpstack 

IMHOこれらのコマンドは、必要に応じてPDBからシンボルをロードします。シンボルの警告が表示された場合はHow to fix symbols in WinDbg

1

Try !sosex.mkを参照してください。これは、インターリーブされた管理フレームおよびネイティブフレームを使用するユーザーフレンドリーなスタックトレースを提供します。私はこれがシンボルの問題だとは思わない。また、管理されたアドレスを持っている場合は、!sosex.mlnに渡してそこにあるものを見ることができますが、あなたはすでにこのコマンドを認識していると思います。

関連する問題