Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 
(연관된 글이 2개 있습니다.)
(시리즈 글이 5개 있습니다.)
디버깅 기술: 112. windbg - 닷넷 메모리 덤프에서 전역 객체의 내용을 조사하는 방법
; https://www.sysnet.pe.kr/2/0/11460

디버깅 기술: 115. windbg - 닷넷 메모리 덤프에서 정적(static) 필드 값을 조사하는 방법
; https://www.sysnet.pe.kr/2/0/11487

.NET Framework: 957. C# - static 필드의 정보가 GC Heap에 저장될까요?
; https://www.sysnet.pe.kr/2/0/12387

디버깅 기술: 182. windbg - 닷넷 메모리 덤프에서 AppDomain에 걸친 정적(static) 필드 값을 조사하는 방법
; https://www.sysnet.pe.kr/2/0/13004

디버깅 기술: 193. Windbg - ThreadStatic 필드 값을 조사하는 방법
; https://www.sysnet.pe.kr/2/0/13414




windbg - 닷넷 메모리 덤프에서 정적(static) 필드 값을 조사하는 방법

지난번에, singleton을 비롯해 인스턴스화된 객체 값을 조사하는 방법을 설명했는데요.

windbg - 닷넷 메모리 덤프에서 전역 객체의 내용을 조사하는 방법
; https://www.sysnet.pe.kr/2/0/11460

간단하게 다음과 같은 예제 코드를 이용해 테스트할 수 있습니다.

using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            InstanceClass inst = new InstanceClass();
            inst.Count++;
            Console.WriteLine(inst.Count);

            Console.ReadLine(); // 이 시점에 메모리 덤프
        }
    }

    public class InstanceClass
    {
        public int Count;
    }
}

덤프 파일을 windbg에서 열고 지난번 글에서 설명한 대로 InstanceClass 타입의 Count 값을 이렇게 확인하게 됩니다.

0:000> !dumpheap -type ConsoleApp1.InstanceClass
         Address               MT     Size
0000013d93f26ce8 00007ffde3015ab8       24     

Statistics:
              MT    Count    TotalSize Class Name
00007ffde3015ab8        1           24 ConsoleApp1.InstanceClass
Total 1 objects

0:000> !DumpObj /d 0000013d93f26ce8
Name:        ConsoleApp1.InstanceClass
MethodTable: 00007ffde3015ab8
EEClass:     00007ffde3161020
Size:        24(0x18) bytes
File:        E:\ConsoleApp1\ConsoleApp1\bin\Debug\ConsoleApp1.exe
Fields:
              MT    Field   Offset                 Type VT     Attr            Value Name
00007ffe3df69500  4000002        8         System.Int32  1 instance                1 Count

그럼, 이제 위의 예제 코드에 static 필드를 가진 타입을 추가해 보겠습니다.

using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            StaticClass.Count++;
            Console.WriteLine(StaticClass.Count);

            InstanceClass inst = new InstanceClass();
            inst.Count++;
            Console.WriteLine(inst.Count);

            Console.ReadLine();
        }
    }

    public class StaticClass
    {
        public static int Count;
    }

    public class InstanceClass
    {
        public int Count;
    }
}

당연하겠지만, StaticClass 클래스의 Count 값은 dumpheap으로는 알 수 없습니다. 심지어, 위의 경우에는 인스턴스화 한 적도 없기 때문에 dumpheap으로는 기록조차 찾을 수 없습니다.

0:000> !dumpheap -type ConsoleApp1.StaticClass
         Address               MT     Size

Statistics:
              MT    Count    TotalSize Class Name
Total 0 objects

new를 했어야 Managed Heap에 기록이 남기 때문에 위의 결과는 지극히 정상적인 것입니다. 대신, static 필드의 값은 클래스 정보를 통해 알아낼 수 있습니다. 이를 위해 다음과 같이 클래스의 식별자를 알아내고,

0:000> !name2ee ConsoleApp1.exe!ConsoleApp1.StaticClass
Module:      00007ffde3014110
Assembly:    ConsoleApp1.exe
Token:       0000000002000003
MethodTable: 00007ffde3015b68
EEClass:     00007ffde3161098
Name:        ConsoleApp1.StaticClass

그에 대해 DumpClass 명령을 내리면 됩니다.

0:000> !DumpClass /d 00007ffde3161098
Class Name:      ConsoleApp1.StaticClass
mdToken:         0000000002000003
File:            E:\ConsoleApp1\ConsoleApp1\bin\Debug\ConsoleApp1.exe
Parent Class:    00007ffe3d8d1968
Module:          00007ffde3014110
Method Table:    00007ffde3015b68
Vtable Slots:    4
Total Method Slots:  5
Class Attributes:    100001  
Transparency:        Critical
NumInstanceFields:   0
NumStaticFields:     1
              MT    Field   Offset                 Type VT     Attr            Value Name
00007ffe3df69500  4000001       3c         System.Int32  1   static                1 Count




참고로, 타입 이름을 기준으로 하는 "!dumpheap -type ConsoleApp1.InstanceClass" 명령어로 관리 힙을 검색하는 것은 경우에 따라 불편함이 있습니다. 왜냐하면, 검색어로 준 "ConsoleApp1.InstanceClass" 이름과 정확히 일치하는 것이 아니라 그것을 포함하고 있어도 검색이 되기 때문입니다.

따라서, 해당 타입에 대해 정확히 일치하는 것만 검색하고 싶다면 name2ee 명령을 통해 우선 그 타입의 MethodTable을 얻는 것이 좋습니다.

0:017> !name2ee *!ConsoleApp1.InstanceClass
Module: 02d32010 (teslib.dll)
Token: 0x02000154
MethodTable: 043117dc
EEClass: 02db3280
Name: ConsoleApp1.InstanceClass

이렇게 알아낸 MethodTable로 dumpheap 검색을 하면 됩니다.

0:017> !DumpHeap -mt  043117dc




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]

[연관 글]






[최초 등록일: ]
[최종 수정일: 4/17/2025]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




... 181  182  183  [184]  185  186  187  188  189  190  191  192  193  194  195  ...
NoWriterDateCnt.TitleFile(s)
390정성태11/6/200626850    답변글 .NET Framework: 74.9. WCF에 SSL 적용 (2) - 서비스 제작파일 다운로드1
356정성태10/7/200622402COM 개체 관련: 19. COM의 Apartment를 이해해 보자. [8]
386light10/30/200617374    답변글 COM 개체 관련: 19.1. [답변]: COM 객체를 글로벌마샬으로 만든후, 사용한다.
355정성태10/9/200625140개발 환경 구성: 19. Internet_Zone 하위에 새로운 코드 그룹을 추가하는 예제 [4]파일 다운로드2
353정성태12/31/200633431개발 환경 구성: 18. 윈도우즈 인증서 서비스 이야기 [3]
354정성태10/23/200635963    답변글 개발 환경 구성: 18.1. 윈도우즈 인증서 서비스 설치
372정성태12/31/200637854    답변글 개발 환경 구성: 18.2. 웹 사이트에 SSL을 적용 [3]
373정성태10/24/200629253    답변글 개발 환경 구성: 18.3. 사용자 입장에서의 HTTPS 접근 (1)
374정성태10/25/200626512    답변글 개발 환경 구성: 18.4. 사용자 입장에서의 HTTPS 접근 (2)
391정성태11/7/200630642    답변글 개발 환경 구성: 18.5. 사용자 인증서 발급
392정성태11/11/200643835    답변글 개발 환경 구성: 18.6. 인증서 관리 (1) - 내보내기/가져오기
394정성태11/9/200628342    답변글 개발 환경 구성: 18.7. 인증서 관리 (2) - 개인키를 내보낼 수 있는 유형의 인증서 발급 [1]
395정성태11/9/200640454    답변글 개발 환경 구성: 18.8. 인증서 관리 (3) - 인증서 MMC 관리자 사용
414정성태12/23/200632159    답변글 개발 환경 구성: 18.9. CRL(Certificate Revocation List) 관리
428정성태12/31/200645030    답변글 개발 환경 구성: 18.10. IIS 7 - SSL 사이트 설정하는 방법 [4]
429정성태12/31/200631048    답변글 개발 환경 구성: 18.11. 서비스를 위한 인증서 설치
352정성태10/2/200620766개발 환경 구성: 17. VPC에 Linux 설치하는 방법 [1]
351정성태10/8/200623318개발 환경 구성: 16. 성태의 무식한(!) 리눅스 탐방기. [4]
349정성태9/26/200621998디버깅 기술: 10. C++/CLI에서 제공되는 명시적인 파괴자의 비밀
347정성태10/6/200625751디버깅 기술: 9. .NET IDisposable 처리 정리 [1]
346정성태9/23/200619260개발 환경 구성: 15. 툴박스에 컨트롤이 자동으로 나타나도록 해주는 옵션 설정
345정성태9/20/200618468오류 유형: 12. WCF 오류 메시지 - Error while trying to reflect on attribute 'MessageContractAttribute'
343정성태10/18/200630328개발 환경 구성: 14. SandCastle 사용법 (NDoc을 대체하는 문서화 도구) [1]파일 다운로드1
344정성태9/20/200620542    답변글 개발 환경 구성: 14.1. 오류 유형 - GAC 에 등록된 DLL 에 대한 문서화 시 오류
340정성태9/15/200619800개발 환경 구성: 13. ISO 파일을 가상 CD-ROM으로 매핑해주는 프로그램
339정성태9/14/200619279오류 유형: 11. ProtocolsSection?
... 181  182  183  [184]  185  186  187  188  189  190  191  192  193  194  195  ...