성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] Java - How to use the Foreign Funct...
[정성태] 제가 큰 실수를 했군요. ^^; Delegate를 통한 Bein...
[정성태] Working with Rust Libraries from C#...
[정성태] Detecting blocking calls using asyn...
[정성태] 아쉽게도, 커뮤니티는 아니고 개인 블로그입니다. ^^
[정성태] 질문이 잘 이해가 안 됩니다. 우선, 해당 소스코드에서 ILis...
[양승조
] var대신 dinamic으로 선언해서 해결은 했습니다. 맞는 해...
[양승조
] 또 막혔습니다. ㅠㅠ var list = props[i].Ge...
[양승조
] 아. 감사합니다. 어제는 안됐던것 같은데....정신을 차려야겠네...
[정성태] "props[i].GetValue(props[i])" 코드에서 ...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <h1 style='font-family: Malgun Gothic, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>windbg - 닷넷 메모리 덤프에서 정적(static) 필드 값을 조사하는 방법</h1> <p> 지난번에, singleton을 비롯해 인스턴스화된 객체 값을 조사하는 방법을 설명했는데요.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > windbg - 닷넷 메모리 덤프에서 전역 객체의 내용을 조사하는 방법 ; <a target='tab' href='http://www.sysnet.pe.kr/2/0/11460'>http://www.sysnet.pe.kr/2/0/11460</a> </pre> <br /> 간단하게 다음과 같은 예제 코드를 이용해 테스트할 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > 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; } } </pre> <br /> 덤프 파일을 windbg에서 열고 <a target='tab' href='http://www.sysnet.pe.kr/2/0/11460'>지난번 글에서 설명한 대로 InstanceClass 타입의 Count 값을 이렇게 확인</a>하게 됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > 0:000> <span style='color: blue; font-weight: bold'>!dumpheap -type ConsoleApp1.InstanceClass</span> Address MT Size <span style='color: blue; font-weight: bold'>0000013d93f26ce8</span> 00007ffde3015ab8 24 Statistics: MT Count TotalSize Class Name 00007ffde3015ab8 1 24 ConsoleApp1.InstanceClass Total 1 objects 0:000> <span style='color: blue; font-weight: bold'>!DumpObj /d 0000013d93f26ce8</span> 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 <span style='color: blue; font-weight: bold'>Value</span> Name 00007ffe3df69500 4000002 8 System.Int32 1 instance <span style='color: blue; font-weight: bold'>1</span> Count </pre> <br /> 그럼, 이제 위의 예제 코드에 static 필드를 가진 타입을 추가해 보겠습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > using System; namespace ConsoleApp1 { class Program { static void Main(string[] args) { <span style='color: blue; font-weight: bold'>StaticClass.Count++; Console.WriteLine(StaticClass.Count);</span> InstanceClass inst = new InstanceClass(); inst.Count++; Console.WriteLine(inst.Count); Console.ReadLine(); } } <span style='color: blue; font-weight: bold'> public class StaticClass { public static int Count; }</span> public class InstanceClass { public int Count; } } </pre> <br /> 당연하겠지만, StaticClass 클래스의 Count 값은 dumpheap으로는 알 수 없습니다. 심지어, 위의 경우에는 인스턴스화 한 적도 없기 때문에 dumpheap으로는 기록조차 찾을 수 없습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > 0:000> <span style='color: blue; font-weight: bold'>!dumpheap -type ConsoleApp1.StaticClass</span> Address MT Size Statistics: MT Count TotalSize Class Name <span style='color: blue; font-weight: bold'>Total 0 objects</span> </pre> <br /> new를 했어야 Managed Heap에 기록이 남기 때문에 위의 결과는 지극히 정상적인 것입니다. 대신, static 필드의 값은 클래스 정보를 통해 알아낼 수 있습니다. 이를 위해 다음과 같이 클래스의 식별자를 알아내고,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > 0:000> <span style='color: blue; font-weight: bold'>!name2ee ConsoleApp1.exe!ConsoleApp1.StaticClass</span> Module: 00007ffde3014110 Assembly: ConsoleApp1.exe Token: 0000000002000003 MethodTable: 00007ffde3015b68 <span style='color: blue; font-weight: bold'>EEClass: 00007ffde3161098</span> Name: ConsoleApp1.StaticClass </pre> <br /> 그에 대해 DumpClass 명령을 내리면 됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > 0:000> <span style='color: blue; font-weight: bold'>!DumpClass /d 00007ffde3161098</span> 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 <span style='color: blue; font-weight: bold'>Value</span> Name 00007ffe3df69500 4000001 3c System.Int32 1 static <span style='color: blue; font-weight: bold'>1</span> Count </pre> <br /> <hr style='width: 50%' /><br /> <br /> 참고로, 타입 이름을 기준으로 하는 "!dumpheap -type ConsoleApp1.InstanceClass" 명령어로 관리 힙을 검색하는 것은 경우에 따라 불편함이 있습니다. 왜냐하면, 검색어로 준 "ConsoleApp1.InstanceClass" 이름과 정확히 일치하는 것이 아니라 그것을 포함하고 있어도 검색이 되기 때문입니다.<br /> <br /> 따라서, 해당 타입에 대해 정확히 일치하는 것만 검색하고 싶다면 name2ee 명령을 통해 우선 그 타입의 MethodTable을 얻는 것이 좋습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > 0:017> <span style='color: blue; font-weight: bold'>!name2ee *!ConsoleApp1.InstanceClass</span> Module: 02d32010 (teslib.dll) Token: 0x02000154 MethodTable: <span style='color: blue; font-weight: bold'>043117dc</span> EEClass: 02db3280 Name: ConsoleApp1.InstanceClass </pre> <br /> 이렇게 알아낸 MethodTable로 dumpheap 검색을 하면 됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > 0:017> !DumpHeap -mt 043117dc </pre> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
9130
(왼쪽의 숫자를 입력해야 합니다.)