WinDbg 분석. dump 파일 을 사용 하여 CPU 점용 과 메모리 점용 의 문제점 을 찾 습 니 다.

9807 단어 dump
설치 도구 다운로드
http://msdn.microsoft.com/en-us/windows/hardware/gg463009.aspx
문제 프로그램 작성
using System;

using System.Collections.Generic;

using System.Threading;



namespace ConsoleApplication1

{

    class Program

    {

        private readonly List<Byte[]> _list = new List<byte[]>();



        void CostMemory()

        {

            for (var i = 0; i < 10; i++)

            {

                _list.Add(new byte[1024 * 1024 * 10]);

            }

        }



        void CostCpu()

        {

            new Thread(() =>

            {

                while (true)

                {

                    Console.WriteLine(_list.Count);

                }

            }).Start();

        }



        static void Main()

        {

            var o = new Program();

            o.CostMemory();

            o.CostCpu();



            Console.ReadKey(true);

        }

    }

}

프로그램 을 실행 하고. dump 파일 을 생 성 합 니 다.
운영 체제 의 작업 관리자 나 adplus (adplus - hang - pn < 프로 세 스 이름 > - o < 출력 파일 경로 >) 등 도 구 를 사용 할 수 있 습 니 다. 물론 WinDbg 를 직접 사용 할 수도 있 습 니 다. (invasive 방식 으로 프로 세 스 를 마 운 트 한 후. dump - m < 출력 파일 경로 > 를 사용 합 니 다)
WinDbg 로 분석
WinDbg 설정
WinDbg 를 열 고 경로 설정
  •   기호 파일 경로 (. pdb 파일 디 렉 터 리 경로)
  •     C:\Users\Administrator\Desktop\ConsoleApplication1t;SRV*C:\symbolscache*http://msdl.microsoft.com/download/symbols
  •   소스 파일 경로 (소스 코드 파일 디 렉 터 리 경로)
  •     C:\Users\Administrator\Desktop\ConsoleApplication1
  •   이미지 파일 경로 (실행 가능 한 파일 디 렉 터 리 경로)
  •     C:\Users\Administrator\Desktop\ConsoleApplication1
    . dump 파일 열기
    메뉴 클릭 File / Open Crash Dump
    SOS. dll 확장 명령 모듈 불 러 오기
      실행 명령:. loadby sos clr
    또는. load C: \ \ Windows \ Microsoft. NET \ \ Framework 64 \ v 4.0.30319 \ sos. dll
    CPU 가 너무 많이 차지 하 는 원인 찾기
    집행!threadpool 이 문제 의 근원 인지 아 닌 지 를 봅 니 다.
    0:000> !threadpool
    
    *** ERROR: Symbol file could not be found.  Defaulted to export symbols for clr.dll - 
    
    PDB symbol for clr.dll not loaded
    
    CPU utilization: 0%
    
    Worker Thread: Total: 0 Running: 0 Idle: 0 MaxLimit: 0 MinLimit: 0
    
    Work Request in Queue: 0
    
    --------------------------------------
    
    Number of Timers: 0
    
    --------------------------------------
    
    Completion Port Thread:Total: 0 Free: 0 MaxFree: 0 CurrentLimit: 0 MaxLimit: 1000 MinLimit: 0

    "CPU utilization 0%" 는 ThreadPool 의 문제 가 아니 라 는 거 죠.
    집행!runaway 스 레 드 실행 시간 보기
    0:000> !runaway
    
     User Mode Time
    
      Thread       Time
    
       4:714       0 days 0:00:00.358
    
       3:38c       0 days 0:00:00.000
    
       2:b94       0 days 0:00:00.000
    
       1:8bc       0 days 0:00:00.000
    
       0:8ec       0 days 0:00:00.000

    실행 시간 이 가장 긴 것 은 스 레 드 4 입 니 다.
    실행 ~ 4s 현재 스 레 드 를 스 레 드 4 로 전환 합 니 다.
    0:004> ~4 s
    
    ntdll!ZwRequestWaitReplyPort+0xa:
    
    00000000`776400da c3              ret

    집행!clrstack 현재 스 레 드 호출 스 택 표시
    0:004> !clrstack
    
    OS Thread Id: 0xa68 (4)
    
    Child SP         IP               Call Site
    
    000000001c4feb68 00000000776400da [NDirectMethodFrameStandalone: 000000001c4feb68] System.IO.__ConsoleStream.WriteFile(Microsoft.Win32.SafeHandles.SafeFileHandle, Byte*, Int32, Int32 ByRef, IntPtr)
    
    000000001c4feb10 000007fef12c34a1 DomainNeutralILStubClass.IL_STUB_PInvoke(Microsoft.Win32.SafeHandles.SafeFileHandle, Byte*, Int32, Int32 ByRef, IntPtr)*** WARNING: Unable to verify checksum for mscorlib.ni.dll
    
    *** ERROR: Module load completed but symbols could not be loaded for mscorlib.ni.dll
    
    
    
    000000001c4fec30 000007fef127cf9f System.IO.__ConsoleStream.WriteFileNative(Microsoft.Win32.SafeHandles.SafeFileHandle, Byte[], Int32, Int32, Int32, Int32 ByRef)
    
    000000001c4fec90 000007fef127cefa System.IO.__ConsoleStream.Write(Byte[], Int32, Int32)
    
    000000001c4fecf0 000007fef1253a09 System.IO.StreamWriter.Flush(Boolean, Boolean)
    
    000000001c4fed50 000007fef1a77b3d System.IO.TextWriter+SyncTextWriter.WriteLine(Int32)
    
    000000001c4feda0 000007ff0016030d ConsoleApplication1.Program.<CostCpu>b__0()*** WARNING: Unable to verify checksum for ConsoleApplication1.exe
    
     [f:\Documents\Visual Studio 2012\Projects\2012test\ConsoleApplication1\Program.cs @ 23]
    
    000000001c4fede0 000007fef121181c System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
    
    000000001c4fee40 000007fef121172b System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
    
    000000001c4fee90 000007fef12a6f2d System.Threading.ThreadHelper.ThreadStart()
    
    000000001c4ff2e8 000007fef33a10b4 [GCFrame: 000000001c4ff2e8] 
    
    000000001c4ff6d0 000007fef33a10b4 [DebuggerU2MCatchHandlerFrame: 000000001c4ff6d0] 

    원인 은 Costcpu 방법, 코드 파일 의 23 줄 에 있 습 니 다.
    메모리 사용량 이 너무 높 은 원인 찾기
    집행!eeheap - gc 위탁 관리 더미 의 총 정보 보기
    0:004> !eeheap -gc
    
    Number of GC Heaps: 1
    
    generation 0 starts at 0x0000000002a26220
    
    generation 1 starts at 0x0000000002a21cf0
    
    generation 2 starts at 0x0000000002a11000
    
    ephemeral segment allocation context: none
    
             segment             begin         allocated  size
    
    0000000002a10000  0000000002a11000  0000000002af2238  0xe1238(922168)
    
    Large object heap starts at 0x0000000012a11000
    
             segment             begin         allocated  size
    
    0000000012a10000  0000000012a11000  0000000018e171e0  0x64061e0(104882656)
    
    Total Size:              Size: 0x64e7418 (105804824) bytes.
    
    ------------------------------
    
    GC Heap Size:    Size: 0x64e7418 (105804824) bytes.

    보아하니 큰 대상 이 가장 많은 메모 리 를 차지 하 는 것 같다.
    집행!dumpheap - min 200 - stat 메모리 사용량 의 대상 별 통계 획득
    0:004> !dumpheap -min 200 -stat
    
    total 0 objects
    
    Statistics:
    
                  MT    Count    TotalSize Class Name
    
    000007fef1369750        1          216 System.AppDomain
    
    000007fef13745d0        2          432 System.Globalization.NumberFormatInfo
    
    000007fef1373148        1          432 System.Collections.Generic.Dictionary`2+Entry[[System.Type, mscorlib],[System.Security.Policy.EvidenceTypeDescriptor, mscorlib]][]
    
    000007fef136b7b0        2         1056 System.Globalization.CultureData
    
    000007fef136c7e8        2         1128 System.Int32[]
    
    000007fef136b328        3         3256 System.Char[]
    
    000007fef136d110        1         4752 System.Collections.Generic.Dictionary`2+Entry[[System.String, mscorlib],[System.String, mscorlib]][]
    
    0000000000664be0       22        31784      Free
    
    000007fef136ae78        5        34072 System.Object[]
    
    000007fef1370bc0       11    104858384 System.Byte[]
    
    Total 50 objects

    바이트 배열 형식 이 가장 많은 메모 리 를 차지 합 니 다.
    집행!dumpheap - type Byte [] - min 200 은 각 Byte 배열 이 메모리 사용량 을 차지 하 는 상세 한 정 보 를 봅 니 다.
    0:004> !dumpheap -type Byte[] -min 200
    
             Address               MT     Size
    
    0000000002a25290 000007fef1370bc0      544     
    
    0000000012a17048 000007fef1370bc0 10485784     
    
    0000000013417060 000007fef1370bc0 10485784     
    
    0000000013e17078 000007fef1370bc0 10485784     
    
    00000000148170a8 000007fef1370bc0 10485784     
    
    00000000152170d8 000007fef1370bc0 10485784     
    
    0000000015c17108 000007fef1370bc0 10485784     
    
    0000000016617138 000007fef1370bc0 10485784     
    
    0000000017017168 000007fef1370bc0 10485784     
    
    0000000017a17198 000007fef1370bc0 10485784     
    
    00000000184171c8 000007fef1370bc0 10485784     
    
    total 0 objects
    
    Statistics:
    
                  MT    Count    TotalSize Class Name
    
    000007fef1370bc0       11    104858384 System.Byte[]
    
    Total 11 objects

    아무 거나 큰 상 대 를 골 라 서 나 오 세 요.
    집행!gcroot < Byte 배열 대상 주소 > 대상 참조 관계 보기
    0:004> !gcroot 0000000012a17048 
    
    Note: Roots found on stacks may be false positives. Run "!help gcroot" for
    
    more info.
    
    Scan Thread 0 OSTHread a54
    
    RSP:54e958:Root:  0000000002a21e60(System.Threading.ThreadStart)->
    
      0000000002a21cb0(ConsoleApplication1.Program)->
    
      0000000002a21cc8(System.Collections.Generic.List`1[[System.Byte[], mscorlib]])->
    
      0000000002a21dc0(System.Byte[][])->
    
      0000000012a17048(System.Byte[])

    Program 클래스 의 List 타 입 멤버 를 추 적 했 습 니 다.
    집행!do < Program 대상 주소 > 대상 에 대한 자세 한 정보 보기
    0:004> !do 0000000002a21cb0
    
    Name:        ConsoleApplication1.Program
    
    MethodTable: 000007ff00044140
    
    EEClass:     000007ff00152350
    
    Size:        24(0x18) bytes
    
    File:        C:\Users\Administrator\Desktop\ConsoleApplication1\ConsoleApplication1.exe
    
    Fields:
    
                  MT    Field   Offset                 Type VT     Attr            Value Name
    
    000007ff00032600  4000001        8 ...yte[], mscorlib]]  0 instance 0000000002a21cc8 _list

    바로리스트 입 니 다.소스 파일 이 있 으 면 이 단 계 는 생략 할 수 있 습 니 다. 소스 파일 이 없어 도 이용 할 수 있 습 니 다!dumpdomain 과!SaveModule 명령 으로 모듈 을 내 보 낸 다음 Reflector 를 사용 하여 역 컴 파일 합 니 다.
    자원.
      Windbg 분석 Dump 파일 간단 한 프 리 젠 테 이 션 (회전)  SOS. dll (SOS 디 버 깅 확장) 학습 발췌 문. WinDBG 명령 개관
    Windbg 디버그. Net 프로그램 사용 하기
    Windbg 로. NET 프로그램의 자원 유출 을 디 버 깅 합 니 다.

    좋은 웹페이지 즐겨찾기