2017-03-14 1 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, A + B, A + B + C를 보려면 어떤 DLL이 필요합니까? –

+0

네이티브 코드가 아니라 .NET 용 코드임을 알고 계셨습니까? PDB 파일을로드하는 것만 큼 간단하지 않습니다. WinDbg은 .NET 자체를 디버깅 할 수 없습니다. –

0

~62k과 같은 k 명령은 기본 호출 스택에 대한 명령입니다. 닷도 표시합니다. NET 메소드는 제외합니다 (기본 메소드는 clr.dll 제외).

.loadby sos clr 

을 그리고 다음 .NET 호출 스택을보고 그 확장의 명령을 사용

는 WinDbg를위한 .NET 확장을로드 할 필요는 .NET 스택을 참조하십시오. 먼저 스레드 62로 전환하십시오.

~62s 
!clrstack 
!dumpstack 

IMHO 이러한 명령은 필요할 때 PDB에서 기호를로드합니다. 기호 경고가 표시되면 How to fix symbols in WinDbg

1

시도 !sosex.mk을 참조하십시오. 인터리브 된 관리 프레임과 기본 프레임을 사용하여 사용자에게 친숙한 스택 추적을 제공합니다. 나는 이것이 상징적 인 문제라고 생각하지 않는다. 또한 관리 주소가있는 경우 !sosex.mln에 전달하면 찾을 수있는 항목을 볼 수 있지만이 명령을 이미 알고있는 것 같습니다.

관련 문제