성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] VT sequences to "CONOUT$" vs. STD_O...
[정성태] NetCoreDbg is a managed code debugg...
[정성태] Evaluating tail call elimination in...
[정성태] What’s new in System.Text.Json in ....
[정성태] What's new in .NET 9: Cryptography ...
[정성태] 아... 제시해 주신 "https://akrzemi1.wordp...
[정성태] 다시 질문을 정리할 필요가 있을 것 같습니다. 제가 본문에...
[이승준] 완전히 잘못 짚었습니다. 댓글 지우고 싶네요. 검색을 해보...
[정성태] 우선 답글 감사합니다. ^^ 그런데, 사실 저 예제는 (g...
[이승준] 수정이 안되어서... byteArray는 BYTE* 타입입니다...
글쓰기
제목
이름
암호
전자우편
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/sos - Dictionary의 entries 배열 내용을 모두 덤프하는 방법 (do_hashtable.py)</h1> <p> 지난 글에서,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > windbg/sos - Hashtable의 buckets 배열 내용을 모두 덤프하는 방법 (do_hashtable.py) ; <a target='tab' href='http://www.sysnet.pe.kr/2/0/12084'>http://www.sysnet.pe.kr/2/0/12084</a> </pre> <br /> Hashtable 타입의 buckets 배열을 덤프하는 do_hashtable.py 스크립트를 알아봤는데요, 기왕 한 김에 이번에는 Dictionary 타입도 살펴보겠습니다. 실습을 위해 역시 Dictionary 인스턴스의 GC Heap 주소를 출력하는 코드를 작성하고,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > { Dictionary<string, string> hash = new Dictionary<string, string>(); hash["TEST"] = "1abc"; hash["qwer"] = "2def"; TypedReference tr = __makeref(hash); IntPtr ptr = **(IntPtr**)(&tr); <span style='color: blue; font-weight: bold'>Console.WriteLine(ptr.ToInt64().ToString("x")); // 1cb34d02f40</span> Console.WriteLine(hash); Console.WriteLine("debug this..."); Console.ReadLine(); } </pre> <br /> windbg를 붙여 덤프합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > 0:006> <span style='color: blue; font-weight: bold'>.loadby sos clr</span> 0:006> <span style='color: blue; font-weight: bold'>!do 1cb34d02f40</span> Name: System.Collections.Generic.Dictionary`2[[System.String, mscorlib],[System.String, mscorlib]] MethodTable: 00007ffd977390a8 EEClass: 00007ffd978d4130 Size: 80(0x50) bytes File: C:\WINDOWS\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll Fields: MT Field Offset Type VT Attr Value Name 00007ffd977c8090 4001887 8 System.Int32[] 0 instance 000001cb34d03018 buckets <span style='color: blue; font-weight: bold'>00007ffd98992618 4001888 10 ...non, mscorlib]][] 0 instance 000001cb34d03040 entries</span> 00007ffd977c80f8 4001889 38 System.Int32 1 instance 2 count 00007ffd977c80f8 400188a 3c System.Int32 1 instance 2 version 00007ffd977c80f8 400188b 40 System.Int32 1 instance -1 freeList 00007ffd977c80f8 400188c 44 System.Int32 1 instance 0 freeCount 00007ffd9774f228 400188d 18 ...Canon, mscorlib]] 0 instance 000001cb34d03000 comparer 00007ffd97751118 400188e 20 ...Canon, mscorlib]] 0 instance 0000000000000000 keys 00007ffd97762ae8 400188f 28 ...Canon, mscorlib]] 0 instance 0000000000000000 values 00007ffd977c5f88 4001890 30 System.Object 0 instance 0000000000000000 _syncRoot </pre> <br /> 이번에는 entries라는 필드로 내부 자료 구조를 유지하고 있는데 이것의 타입이 좀 깁니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > 0:006> <span style='color: blue; font-weight: bold'>!DumpObj /d 000001cb34d03040</span> Name: <span style='color: blue; font-weight: bold'>System.Collections.Generic.Dictionary`2+Entry[[System.String, mscorlib],[System.String, mscorlib]][]</span> MethodTable: 00007ffd9775b7f0 EEClass: 00007ffd978bd288 Size: 96(0x60) bytes Array: Rank 1, Number of elements 3, Type VALUETYPE (<span style='color: blue; font-weight: bold'>Print Array</span>) Fields: None </pre> <br /> entries 필드의 값을 덤프해 보면,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > 0:006> <span style='color: blue; font-weight: bold'>!DumpArray /d 000001cb34d03040</span> Name: System.Collections.Generic.Dictionary`2+Entry[[System.String, mscorlib],[System.String, mscorlib]][] MethodTable: 00007ffd9775b7f0 EEClass: 00007ffd978bd288 Size: 96(0x60) bytes Array: Rank 1, Number of elements 3, Type <span style='color: blue; font-weight: bold'>VALUETYPE</span> Element Methodtable: <span style='color: blue; font-weight: bold'>00007ffd9775b790</span> [0] <span style='color: blue; font-weight: bold'>000001cb34d03050</span> [1] 000001cb34d03068 [2] 000001cb34d03080 </pre> <br /> 역시 이번에도, <a target='tab' href='http://www.sysnet.pe.kr/2/0/12084#DML'>DML로 제공</a>하는 "000001cb34d03050" 링크를 누르면 Entry[]에 대한 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:006> <span style='color: blue; font-weight: bold'>!DumpVC /d 00007ffd9775b7f0 000001cb34d03050</span> Name: System.Collections.Generic.Dictionary`2+Entry[[System.String, mscorlib],[System.String, mscorlib]][] MethodTable: 00007ffd9775b7f0 EEClass: 00007ffd978bd288 Size: 24(0x18) bytes File: C:\WINDOWS\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll Fields: </pre> <br /> 따라서 개별 Entry 값을 확인하려면 DML 링크를 사용하지 말고 직접 다음과 같이 <a target='tab' href='http://www.sysnet.pe.kr/2/0/12084#dumpvc'>dumpvc 명령</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:006> <span style='color: blue; font-weight: bold'>!DumpVC /d 00007ffd9775b790 000001cb34d03050</span> Name: System.Collections.Generic.Dictionary`2+Entry[[System.String, mscorlib],[System.String, mscorlib]] MethodTable: 00007ffd9775b790 EEClass: 00007ffd978bce48 Size: 40(0x28) bytes File: C:\WINDOWS\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll Fields: MT Field <span style='color: blue; font-weight: bold'>Offset</span> Type VT Attr Value Name 00007ffd977c80f8 4003502 <span style='color: blue; font-weight: bold'>10</span> System.Int32 1 instance 775949382 <span style='color: blue; font-weight: bold'>hashCode</span> 00007ffd977c80f8 4003503 <span style='color: blue; font-weight: bold'>14</span> System.Int32 1 instance -1 <span style='color: blue; font-weight: bold'>next</span> 00007ffd977c9a60 4003504 <span style='color: blue; font-weight: bold'>0</span> System.__Canon 0 instance 000001cb34d02e48 <span style='color: blue; font-weight: bold'>key</span> 00007ffd977c9a60 4003505 <span style='color: blue; font-weight: bold'>8</span> System.__Canon 0 instance 000001cb34d02e70 <span style='color: blue; font-weight: bold'>value</span> </pre> <br /> 자... 그런데 Entry 타입이 가진 필드가 (Hashtable의 bucket이 3개를 가진 것과는 달리) 4개입니다. 하지만, 다행히 hashCode와 next 필드의 값이 Int32이고 4바이트 정렬이 되어 있어 최종적으로는 24바이트씩 차지하는 데에는 변함이 없습니다. 따라서 배열 요소를 한 줄 씩 덤프하는 방법도 같고,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > 0:006> <span style='color: blue; font-weight: bold'>dq /c3 000001cb34d03050 L9</span> 000001cb`34d03050 000001cb`34d02e48 000001cb`34d02e70 ffffffff`2e400c46 000001cb`34d03068 000001cb`34d02e98 000001cb`34d02ec0 00000000`34a6e611 000001cb`34d03080 00000000`00000000 00000000`00000000 00000000`00000000 </pre> <br /> 결국 지난 글에 작성한 do_hashtable.py를 그대로 사용해 첫 번째 원소의 주솟값을 기준으로 값을 덤프할 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > 0:006> <span style='color: blue; font-weight: bold'>!py d:\wext\do_hashtable.py 000001cb34d03050 3</span> [0] key: "TEST", value: "1abc" [1] key: "qwer", value: "2def" [2] (empty) </pre> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
1996
(왼쪽의 숫자를 입력해야 합니다.)