성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
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'>PDB 기호 파일의 경로 구성 방식</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;' > 이름: _NT_SYMBOL_PATH 값: SRV*e:\Symbols*http://msdl.microsoft.com/download/symbols; </pre> <br /> 이렇게 해두면, 마이크로소프트의 운영체제에 포함된 거의 모든 DLL들에 대한 PDB Symbol 파일을 비주얼 스튜디오로 디버깅 시에 "<a target='tab' href='http://msdl.microsoft.com/download/symbols'>http://msdl.microsoft.com/download/symbols</a>" 사이트로부터 자동으로 내려받아 "e:\Symbols" 폴더에 저장해 두고 재사용을 합니다. 그리고, 그 PDB 덕분에 콜스택 정보가 더 의미있는 정보로 채워지죠!<br /> <br /> 예를 들어, 이렇게 환경 변수가 설정된 상태에서 비주얼 스튜디오로 윈폼 프로그램을 디버깅하면 다음의 경로에 System.Windows.Forms.pdb 파일이 있는 것을 확인할 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > E:\Symbols\System.Windows.Forms.pdb\7F6FF641DD3142F99E0B7FF412EDA4261\System.Windows.Forms.pdb </pre> <br /> 대충 폴더 구조는 알 수 있겠는데... "7F6FF641DD3142F99E0B7FF412EDA4261" 값의 의미가 갑자기 궁금해졌습니다. ^^ 그래서 한번 찾아봤습니다. ^^<br /> <br /> <hr style='width: 50%' /><br /> <br /> 검색해 보니, 다음의 글이 나오는데요.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Microsoft Symbol Server / Local Cache Hash Algorithm ; <a target='tab' href='http://stackoverflow.com/questions/1419347/microsoft-symbol-server-local-cache-hash-algorithm'>http://stackoverflow.com/questions/1419347/microsoft-symbol-server-local-cache-hash-algorithm</a> </pre> <br /> 아쉽게도 정답은 없지만, 적어도 "7F6FF641DD3142F99E0B7FF412EDA4261" 의미에 대해서는 알 수 있습니다. 위의 글을 정리하면 PdbSig70과 Age의 값이라고 합니다. 이를 확인하기 위해 dumpbin.exe를 이용해 제가 참조한 System.Windows.Forms.dll을 인자로 주면,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > dumpbin.exe /HEADERS "C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Windows.Forms\v4.0_4.0.0.0__b77a5c561934e089\System.Windows.Forms.dll" </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;' > PE signature found File Type: DLL FILE HEADER VALUES ...[생략]... OPTIONAL HEADER VALUES ...[생략]... 10 number of directories 0 [ 0] RVA [size] of Export Directory ...[생략]... 47FA74 [ 1C] RVA [size] of Debug Directory ...[생략]... SECTION HEADER #1 ...[생략]... Debug Directories Time Type Size RVA Pointer -------- ------ -------- -------- -------- 551B8AF9 cv 31 0047FA90 47DC90 Format: RSDS, {<span style='color: blue; font-weight: bold'>7F6FF641-DD31-42F9-9E0B-7FF412EDA426</span>}, <span style='color: blue; font-weight: bold'>1</span>, System.Windows.Forms.pdb SECTION HEADER #2 ...[생략]... SECTION HEADER #3 ...[생략]... </pre> <br /> "Debug Directory"에 "CV" 타입으로 "RSDS" 포맷의 PDB 정보를 담고 있는데, 시그니처 값이 "7F6FF641-DD31-42F9-9E0B-7FF412EDA426"에서 '-' 문자를 제거하면 "7F6FF641DD3142F99E0B7FF412EDA426" 문자열이 나오고, 여기에 다시 "Age" 값인 "1"을 붙여주면 "7F6FF641DD3142F99E0B7FF412EDA4261"라고 완성이 됩니다.<br /> <br /> <hr style='width: 50%' /><br /> <br /> 그런데, "<a target='tab' href='http://stackoverflow.com/questions/1419347/microsoft-symbol-server-local-cache-hash-algorithm'>Microsoft Symbol Server / Local Cache Hash Algorithm</a>" 글에 보면 그 값이 항상 GUID 길이가 아니라고 합니다. 실제로 Windows Server 2003 x86 운영체제에서 심벌을 받아보면 "msvcirt.dll"의 경우 다음과 같은 경로에 저장됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > E:\symbols\msvcirt.pdb\<span style='color: blue; font-weight: bold'>3E7FFFD21</span>\msvcirt.pdb </pre> <br /> 9글자인데, GUID와는 전혀 무관해 보입니다. 하지만, 이 값 역시 DLL의 "Debug Directory"에 보관된 값과 연결됩니다. 다음은 msvcirt.dll에 대한 dumpbin 결과입니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > C:\Program Files (x86)\Microsoft Visual Studio 12.0>dumpbin /HEADERS c:\temp\msvcirt.dll Microsoft (R) COFF/PE Dumper Version 12.00.31101.0 Copyright (C) Microsoft Corporation. All rights reserved. Dump of file c:\temp\msvcirt.dll PE signature found File Type: DLL FILE HEADER VALUES ...[생략]... OPTIONAL HEADER VALUES ...[생략]... 10 number of directories ...[생략]... F000 [ 54C] RVA [size] of Base Relocation Directory 1100 [ 1C] RVA [size] of Debug Directory ...[생략]... 0 [ 0] RVA [size] of Reserved Directory SECTION HEADER #1 ...[생략]... Debug Directories Time Type Size RVA Pointer -------- ------ -------- -------- -------- <span style='color: blue; font-weight: bold'>3E7FFFD2 cv 1C 00001408 808 Format: NB10, 3E7FFFD2, 1, msvcirt.pdb</span> SECTION HEADER #2 ...[생략]... SECTION HEADER #3 ...[생략]... SECTION HEADER #4 ...[생략]... </pre> <br /> 포맷이 좀 다르다는 거군요! RSDS가 아니고 "NB10"유형이고 값은 "3E7FFFD2" + "1"로 "3E7FFFD21"이 됩니다. (또한, 그 값은 "Time" 헤더의 값과 일치합니다.)<br /> <br /> <hr style='width: 50%' /><br /> <br /> 아래의 글에 보면, RSDS 포맷과 NB10 포맷에 대한 간략 이력이 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > SYMBOL RETRIEVER SHELL EXTENSION ; <a target='tab' href='http://www.vitoplantamura.com/index.aspx?page=symretriever'>http://www.vitoplantamura.com/index.aspx?page=symretriever</a> </pre> <br /> .NET 나오기 이전의 Visual Studio에 포함된 컴파일러의 경우 NB10 헤더 구조로 저장하고 있고, 그 이후로는 RSDS 헤더 구조로 바뀌었다고 합니다. 자, 그러면 우리가 이 값을 이용해 PDB 다운로드 폴더 구조를 만들고 싶거나, 또는 심벌 서버로부터 pdb 파일을 받기 위한 URL 구성 목적으로 사용하고 싶다면? dumpbin.exe 출력에서도 나오지만, 그저 Debug Directory 영역을 탐색해 들어가 포맷이 NB10인지, RSDS인지 구분해 내고 이후의 sig값과 age값을 구하면 됩니다.<br /> <br /> 이에 대한 소스코드는 이미 다음과 같이 공개되어 있으니 참고하세요. ^^ (<a target='tab' href='http://www.sysnet.pe.kr/bbs/DownloadAttachment.aspx?fid=928&boardid=331301885'>이 글에 포함된 debugdir.zip 파일은 아래의 코드를 단순히 Visual Studio 2013 프로젝트로 포함</a>시킨 것입니다.)<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > DebugDir.cpp ; <a target='tab' href='http://www.debuginfo.com/examples/src/DebugDir.cpp'>http://www.debuginfo.com/examples/src/DebugDir.cpp</a> </pre> <br /> 기타... PDB 파일 구조에 대해 좀 더 궁금하다면 다음의 글이 도움이 될 것입니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > PDB File Internals ; <a target='tab' href='http://www.informit.com/articles/article.aspx?p=22685'>http://www.informit.com/articles/article.aspx?p=22685</a> </pre> <br /> <hr style='width: 50%' /><br /> <br /> 그런데, 개인적으로 아직도 한가지 안 풀리는 것이 있습니다.<br /> <br /> 다음의 글에 보면,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > SOS.dll 확장 모듈을 버전 별로 구하는 방법 ; <a target='tab' href='http://www.sysnet.pe.kr/2/0/1654'>http://www.sysnet.pe.kr/2/0/1654</a> </pre> <br /> .NET 프로그램의 덤프 파일을 다른 컴퓨터에서 디버깅하려면 그 프로그램이 실행된 컴퓨터에 있던 mscordacwks.dll 파일과 sos.dll 파일이 필요하다고 했습니다.<br /> <br /> 다행히, .NET 4.0 응용 프로그램부터는 mscordacwks.dll 파일의 경우 마이크로소프트 측의 심벌 서버에서 자동으로 내려받게 해주고 있어서 sos.dll 파일만 잘 챙기면 되는 것으로 바뀌었습니다. 그런데, mscordacwks.dll이 다운로드되는 폴더의 시그니처 부분이 좀 이상합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > E:\Symbols\mscordacwks_AMD64_AMD64_4.0.30319.34209.dll\<span style='color: blue; font-weight: bold'>5348A1EF9a0000</span>\mscordacwks_AMD64_AMD64_4.0.30319.34209.dll </pre> <br /> 사실 DLL의 Debug Directory 헤더에서 PDB 파일의 위치를 찾게 되는데, 위의 경우에는 DLL 자체에 대한 위치 값을 구하는 것이 됩니다. 아쉽게도 DLL은 그 자체의 Debug Directory값과는 무관하게 경로가 정해집니다. 다음은 "mscordacwks_AMD64_AMD64_4.0.30319.34209.dll" 파일에 대한 dumpbin 출력 결과입니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > C:\Program Files (x86)\Microsoft Visual Studio 12.0>dumpbin /HEADERS "E:\Symbols\mscordacwks_AMD64_AMD64_4.0.30319.34209.dll\5348A1EF9a0000\mscordacwks_AMD64_AMD64_4.0.30319.34209.dll" Microsoft (R) COFF/PE Dumper Version 12.00.31101.0 Copyright (C) Microsoft Corporation. All rights reserved. Dump of file E:\Symbols\mscordacwks_AMD64_AMD64_4.0.30319.34209.dll\5348A1EF9a0000\mscordacwks_AMD64_AMD64_4.0.30319.34209.dll PE signature found File Type: DLL FILE HEADER VALUES ...[생략]... OPTIONAL HEADER VALUES ...[생략]... 10 number of directories ...[생략]... 1A8000 [ 3038] RVA [size] of Base Relocation Directory 124410 [ 38] RVA [size] of Debug Directory ...[생략]... 0 [ 0] RVA [size] of Reserved Directory SECTION HEADER #1 ...[생략]... SECTION HEADER #2 ...[생략]... Debug Directories Time Type Size RVA Pointer -------- ------ -------- -------- -------- 53489F9D cv 26 00154740 153940 Format: RSDS, {DE43F8F8-8BCE-486C-8E51-A27A90FEC031}, 2, cordacwks.pdb 53489F9D feat 14 00154768 153968 Counts: Pre-VC++ 11.00=4, C/C++=375, /GS=375, /sdl=0, reserved=0 SECTION HEADER #3 ...[생략]... SECTION HEADER #4 ...[생략]... SECTION HEADER #5 ...[생략]... SECTION HEADER #6 ...[생략]... </pre> <br /> 보시는 바와 같이 RSDS 헤더이지만, 해당 GUID값과 5348A1EF9a0000 경로는 완전히 별개입니다. 결국, 저는 windbg가 어떤 규칙으로 특정 버전의 mscordacwks.dll을 마이크로소프트의 심벌 서버로부터 구해오는지?!!! 그것이 궁금해졌습니다. ^^<br /> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
1282
(왼쪽의 숫자를 입력해야 합니다.)