WinDbg+SOS/SOSEX에서Net 애플리케이션의 메모리 덤프 분석
주의점
디버그 대상이 타겟 플랫폼에서 "
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
~*
에 모든 단서의 상태를 표시합니다.웹 페이지 정보
Reference
이 문제에 관하여(WinDbg+SOS/SOSEX에서Net 애플리케이션의 메모리 덤프 분석), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/yz2cm/items/f99dd26c3d865f73ea32텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)