WinDbg+SOS/SOSEX에서Net 애플리케이션의 메모리 덤프 분석

11527 단어 WinDbgdotnetC#
WinDbg를 사용합니다.NET 애플리케이션에 대해 메모리 덤프 분석을 하는 경우는 드물다. (호출 스택에서 방법명을 보면 갑자기 튀어나와 원인을 확인하는 경우가 많기 때문에 기본적으로 Visual Studio는 충분하다) 가끔 사용할 때 기본적인 지령을 잊어버리고 매번 불평을 한다.자신이 자주 사용하는 WinDbg+sos/sosex의 지령을 개인 노트로 기록하다.수시로 추가될 예정이다.
주의점
디버그 대상이 타겟 플랫폼에서 "Any CPU"을 지정하고 "32 ビットを選ぶ"을 활성화하여 구축한 프로그램인 경우 실행 호스트는 64비트 OS라도 32비트 프로세싱으로 실행할 수 있으면 32비트 프로세싱으로 실행합니다.

32비트 프로세스로 실행되는 경우 32비트 버전의 작업 관리자%windir%\SysWOW64\taskmgr.exe에서 프로세스의 덤프 파일을 만듭니다.또한 WinDbg는 WinDbg(x86), sosex.dll는 32비트 버전을 사용하십시오.
작업 관리자의 세부내용 탭에서 대상 프로세스를 선택하고 마우스 오른쪽 버튼 메뉴에서 덤프 파일 작성을 선택하여 덤프 파일을 생성합니다.

sosex.dll 가져오기
사전 STEVE'S TECHSPOT 에서 미리 sosex.dll 받다.본 기사 C:\local\sosex_32\sosex.dll 에 로컬 어디에나 저장됩니다.
sos.dll、sosex.dll 마운트
WinDbg를 시작하면 덤프 파일을 WinDbg 위로 드래그한 다음 다음 일련의 명령을 실행합니다.
0:000> .loadby sos clr
0:000> .load C:\local\sosex_32\sosex.dll
0:000> !chain
!chain의 실행 결과에 sosex.dll의 경로가 포함되면 OK입니다.
0:000> !chain
Extension DLL chain:
    C:\local\sosex_32\sosex.dll: image 4.6.0.0, API 1.0.0, built Mon Mar 14 23:10:18 2016
        [path: C:\local\sosex_32\sosex.dll]
    C:\Windows\Microsoft.NET\Framework\v4.0.30319\sos: image 4.8.4400.0, API 1.0.0, built Fri Jun  4 01:26:38 2021
        [path: C:\Windows\Microsoft.NET\Framework\v4.0.30319\sos.dll]
화면 지우기
실행.cls.
인스턴스 멤버 변수의 값을 알 수 있습니다.
우선 실례의 클래스를 지정하고 실행!DumpHeap -type クラス名합니다.
실례 메모리 주소 획득
0:000> !DumpHeap -type CSSandbox.SampleClass
 Address       MT     Size
01bb24b4 01975f10       20     

Statistics:
      MT    Count    TotalSize Class Name
01975f10        1           20 CSSandbox.SampleClass
Total 1 objects

Address 지정한 필드에 표시된 주소01bb24b4, 실행!DumpObj /d アドレス.
인스턴스 멤버 변수 정보 표시
0:000> !DumpObj /d 01bb24b4
Name:        CSSandbox.SampleClass
MethodTable: 01975f10
EEClass:     01971644
Size:        20(0x14) bytes
File:        C:\Users\yz2cm\source\repos\CSSandbox\CSSandbox\bin\Release\CSSandbox.exe
Fields:
      MT    Field   Offset                 Type VT     Attr    Value Name
7299ff7c  400000a        4 ...eading.Tasks.Task  0 instance 01bb82a0 t
01975f80  400000b        8 ...viceSandboxWorker  0 instance 01bb24c8 worker
7295878c  400000c        c       System.Boolean  1 instance        0 sampleFlag_1
7295878c  400000d        d       System.Boolean  1 instance        1 sampleFlag_2
72952734  4000008        4        System.Object  0   static 01bb823c SampleLock_1
72952734  4000009        8        System.Object  0   static 01bb8248 SampleLock_2
7295878c  400000e       25       System.Boolean  1   static        0 static_sampleFlag_1
7295878c  400000f       26       System.Boolean  1   static        1 static_sampleFlag_2
dd アドレス 덤프 관리 더미.시작할 때 방법표의 바늘값0x01975f10을 가리키기 때문에 0x04 바이트의 편이량을 얻었다.
관리 열
0:000> dd 0x01bb24b4+0x04
01bb24b8  01bb82a0 01bb24c8 00000100 00000000
01bb24c8  01975f80 00000000 80000000 729524e4
01bb24d8  00000008 00650053 00760072 00630069
01bb24e8  00310065 00000000 00000000 71d72720
01bb24f8  00000000 00000000 00000000 01bb2514
01bb2508  00000000 00000000 00000000 72952734
01bb2518  00000000 00000000 72952c60 00000008
01bb2528  00650053 00760072 00630069 00310065
고정 자물쇠 감지!dlk 명령에서 사라진 자물쇠가 검출되었습니다.
고정 자물쇠 검사
0:000> !dlk
Examining SyncBlocks...
Scanning for ReaderWriterLock(Slim) instances...
Scanning for holders of ReaderWriterLock locks...
Scanning for holders of ReaderWriterLockSlim locks...
Examining CriticalSections...
Scanning for threads waiting on SyncBlocks...
*** WARNING: Unable to verify checksum for DeadLockSample.exe
Scanning for threads waiting on ReaderWriterLock locks...
Scanning for threads waiting on ReaderWriterLocksSlim locks...
Scanning for threads waiting on CriticalSections...
*** WARNING: Unable to verify checksum for System.ServiceProcess.ni.dll
*DEADLOCK DETECTED*
CLR thread 0x6 holds the lock on SyncBlock 01315580 OBJ:02018248[System.Object]
...and is waiting for the lock on SyncBlock 0131554c OBJ:0201823c[System.Object]
CLR thread 0x5 holds the lock on SyncBlock 0131554c OBJ:0201823c[System.Object]
...and is waiting for the lock on SyncBlock 01315580 OBJ:02018248[System.Object]
CLR Thread 0x6 is waiting at DeadLockSample.DeadlockSampleClass.RunWorker()(+0x2f IL,+0x7c Native) [C:\Users\yz2cm\source\repos\DeadLockSample\DeadLockSample\DeadlockSampleClass.cs @ 18,21]
CLR Thread 0x5 is waiting at DeadLockSample.DeadLockSampleClass.RunForever()(+0x4b IL,+0xb7 Native) [C:\Users\yz2cm\source\repos\CSharpSandboxDotNet45\DeadLockSample\DeadLockSampleClass.cs @ 32,21]

1 deadlock detected.
단서 목록 보이기
0:000> !threads
ThreadCount:      8
UnstartedThread:  0
BackgroundThread: 4
PendingThread:    0
DeadThread:       3
Hosted Runtime:   no
                                                                         Lock  
       ID OSID ThreadOBJ    State GC Mode     GC Alloc Context  Domain   Count Apt Exception
   0    1 555c 012ec5c8     2a020 Preemptive  020127BC:00000000 012e6748 0     MTA 
   2    2 44c8 012fa1a8     2b220 Preemptive  00000000:00000000 012e6748 0     MTA (Finalizer) 
XXXX    3    0 01324ea0     30820 Preemptive  00000000:00000000 012e6748 0     Ukn 
XXXX    4    0 01327090   1039820 Preemptive  00000000:00000000 012e6748 0     Ukn (Threadpool Worker) 
   3    5 54c0 01329ec0   3029220 Preemptive  02019538:00000000 012e6748 1     MTA (Threadpool Worker) 
   7    6 4204 01340bf8   3029220 Preemptive  0201C318:00000000 012e6748 1     MTA (Threadpool Worker) 
XXXX    7    0 013443d0   1039820 Preemptive  00000000:00000000 012e6748 0     Ukn (Threadpool Worker) 
   8    8 56a0 01345f08   102a220 Preemptive  00000000:00000000 012e6748 0     MTA (Threadpool Worker)
스레드 전환 및 스택 표시
실행!Threads, 조사 대상 라인의 번호를 조사한다.스레드 번호는 ID열의 값이 아니라 ID열 왼쪽의 첫 번째 열의 값입니다.
0:000> !Threads
ThreadCount:      9
UnstartedThread:  0
BackgroundThread: 7
PendingThread:    0
DeadThread:       1
Hosted Runtime:   no
                                                                         Lock  
       ID OSID ThreadOBJ    State GC Mode     GC Alloc Context  Domain   Count Apt Exception
   0    1 2230 012fc098     2a020 Preemptive  01BB27BC:00000000 012f5fe8 0     MTA 
   5    2 4174 0130dbd0     2b220 Preemptive  00000000:00000000 012f5fe8 0     MTA (Finalizer) 
XXXX    3    0 01337f28     30820 Preemptive  00000000:00000000 012f5fe8 0     Ukn 
   6    4 31b0 0133a118   1029220 Preemptive  01BC6418:00000000 012f5fe8 0     MTA (Threadpool Worker) 
   7    5 4a68 0133d218   3029220 Preemptive  01BB9538:00000000 012f5fe8 1     MTA (Threadpool Worker) 
  11    6 430c 01354728   3029220 Preemptive  01BBC318:00000000 012f5fe8 1     MTA (Threadpool Worker) 
  12    7 3c0c 013584c0   1029220 Preemptive  01BC0270:00000000 012f5fe8 0     MTA (Threadpool Worker) 
  13    8 4f4c 0135d348   102a220 Preemptive  00000000:00000000 012f5fe8 0     MTA (Threadpool Worker) 
  14    9 3d38 01337858   1029220 Preemptive  00000000:00000000 012f5fe8 0     MTA (Threadpool Worker) 
실행 ~スレッドの番号s, 이 라인으로 전환합니다.
0:005> ~7s
eax=00000000 ebx=00000001 ecx=00000000 edx=00000000 esi=00000001 edi=00000001
eip=76f02f8c esp=044fef88 ebp=044ff118 iopl=0         nv up ei pl nz na pe nc
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000206
ntdll!NtWaitForMultipleObjects+0xc:
76f02f8c c21400          ret     14h
호출 스택을 표시하려면 !ClrStack를 수행합니다.
0:007> !ClrStack
OS Thread Id: 0x4a68 (7)
Child SP       IP Call Site
044ff2e0 76f02f8c [GCFrame: 044ff2e0] 
044ff3c0 76f02f8c [GCFrame: 044ff3c0] 
044ff3dc 76f02f8c [HelperMethodFrame_1OBJ: 044ff3dc] System.Threading.Monitor.ReliableEnter(System.Object, Boolean ByRef)
044ff458 019c0b0f ServiceSandbox.ServiceSandboxCore.RunForever_SyncContextNull() [C:\Users\yz2cm\source\repos\CSharpSandboxDotNet45\ServiceSandbox\ServiceSandboxCore.cs @ 32]
044ff490 72d9d4bb System.Threading.Tasks.Task.InnerInvoke() [f:\dd\ndp\clr\src\BCL\system\threading\Tasks\Task.cs @ 2884]
044ff49c 72d9b731 System.Threading.Tasks.Task.Execute() [f:\dd\ndp\clr\src\BCL\system\threading\Tasks\Task.cs @ 2498]
044ff4c0 72d9b6fc System.Threading.Tasks.Task.ExecutionContextCallback(System.Object) [f:\dd\ndp\clr\src\BCL\system\threading\Tasks\Task.cs @ 2861]
044ff4c4 72d38604 System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) [f:\dd\ndp\clr\src\BCL\system\threading\executioncontext.cs @ 980]
044ff530 72d38537 System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) [f:\dd\ndp\clr\src\BCL\system\threading\executioncontext.cs @ 928]
044ff544 72d9b4b2 System.Threading.Tasks.Task.ExecuteWithThreadLocal(System.Threading.Tasks.Task ByRef) [f:\dd\ndp\clr\src\BCL\system\threading\Tasks\Task.cs @ 2827]
044ff5a8 72d9b357 System.Threading.Tasks.Task.ExecuteEntry(Boolean) [f:\dd\ndp\clr\src\BCL\system\threading\Tasks\Task.cs @ 2767]
044ff5b8 72d9b29d System.Threading.Tasks.Task.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem() [f:\dd\ndp\clr\src\BCL\system\threading\Tasks\Task.cs @ 2704]
044ff5bc 72d0eb7d System.Threading.ThreadPoolWorkQueue.Dispatch() [f:\dd\ndp\clr\src\BCL\system\threading\threadpool.cs @ 820]
044ff60c 72d0e9db System.Threading._ThreadPoolWaitCallback.PerformWaitCallback() [f:\dd\ndp\clr\src\BCL\system\threading\threadpool.cs @ 1161]
044ff82c 73ecf066 [DebuggerU2MCatchHandlerFrame: 044ff82c] 
모든 단서에 호출 창고 보이기
실행~*e!ClrStack.
스레드 상태 표시
실행~スレッドの番号.
0:011> ~7
   7  Id: 1840.4a68 Suspend: 0 Teb: 00d9a000 Unfrozen
      Start: clr!Thread::intermediateThreadProc (73f94be0)
      Priority: 0  Priority class: 32  Affinity: ff
~*에 모든 단서의 상태를 표시합니다.
웹 페이지 정보
  • 사샤골드슈타인 등(2013)'프로그래머를 위해서.NET 응용 최적화 기술'상영사
  • Mario Hewardt (2009)『 Advanced .NET Debugging 』Addison-Wesley Professional
  • 스토리지에서 덤프합니다.NET의 메모리 상태 탐색
  • 좋은 웹페이지 즐겨찾기