성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] 아쉽게도, 커뮤니티는 아니고 개인 블로그입니다. ^^
[정성태] 질문이 잘 이해가 안 됩니다. 우선, 해당 소스코드에서 ILis...
[양승조
] var대신 dinamic으로 선언해서 해결은 했습니다. 맞는 해...
[양승조
] 또 막혔습니다. ㅠㅠ var list = props[i].Ge...
[양승조
] 아. 감사합니다. 어제는 안됐던것 같은데....정신을 차려야겠네...
[정성태] "props[i].GetValue(props[i])" 코드에서 ...
[정성태] 저렇게 조각 코드 말고, 실제로 재현이 되는 예제 프로젝트를 압...
[정성태] Modules 창(Ctrl+Shift+U)을 띄워서, 해당 Op...
[정성태] 만드실 수 있습니다. 단지, Unity 엔진 내의 스크립트와 W...
[공진영] 안녕하세요 좋은글 감사합니다. 현재 제가 wpf로 관제 모...
글쓰기
제목
이름
암호
전자우편
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'>Visual Studio 2010 - .NET Framework 소스 코드 디버깅 - 두 번째 이야기</h1> <p> 결론부터 말씀드리면, 현재 .NET Framework 소스 코드용 PDB 파일이 정상적으로 서비스되지 않고 있기 때문에 소스 코드 디버깅이 되지 않고 있습니다. 그렇긴 해도, 왜 안되는 지에 대한 이유와 함께 그 과정을 알아가는 것이 재미있기 때문에 이 글을 쓰게 되었습니다.<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;' > Visual Studio 2010 - .NET Framework 소스 코드 디버깅 ; <a target='tab' href='http://www.sysnet.pe.kr/2/0/1009'>http://www.sysnet.pe.kr/2/0/1009</a> </pre> <br /> 현재 기준으로 위의 설정에 따라 디버깅을 시도하면 다음과 같이 "Modules" 창의 "Symbol Status"에서 "Cannot find or open the PDB file."이라는 상태로 나옵니다. (정상적이라면, "Symbols loaded."가 나와야 합니다.)<br /> <br /> <img onclick='toggle_img(this)' class='imgView' alt='netsrc_pdb_match_1.png' src='/SysWebRes/bbs/netsrc_pdb_match_1.png' /><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;' > ".\MicrosoftPublicSymbols\mscorlib.pdb\ED96A7F38A2940F39B9CA7AD9BC5CB671\mscorlib.pdb" </pre> <br /> 제 예상에는, 아마도 위의 파일이 안 올라오는 것을 보면 틀림없이 PDB 파일과 DLL 파일의 signature가 일치하지 않을 듯 한데요. 이에 대해서는 지난번에 소개해 드렸던 chkmatch라는 도구를 이용하면 확인이 가능합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > PDB Symbol 로드 오류 - Cannot find or openthe PDB file. ; <a target='tab' href='http://www.sysnet.pe.kr/2/0/987'>http://www.sysnet.pe.kr/2/0/987</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;' > D:\pdb_match>chkmatch -c C:\Windows\Microsoft.NET\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll E:\NetPdbSources\MicrosoftPublicSymbols\mscorlib.pdb\ED96A7F38A2940F39B9CA7AD9BC5CB671\mscorlib.pdb ChkMatch - version 1.0 Copyright (C) 2004 Oleg Starodumov http://www.debuginfo.com/ <span style='color: blue; font-weight: bold'>Executable: C:\Windows\Microsoft.NET\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll Debug info file: E:\NetPdbSources\MicrosoftPublicSymbols\mscorlib.pdb\ED96A7F38A2940F39B9CA7AD9BC5CB671\mscorlib.pdb </span> Executable: TimeDateStamp: 4e181ae3 Debug info: 2 ( CodeView ) TimeStamp: 4e181ae3 Characteristics: 0 MajorVer: 0 MinorVer: 0 Size: 37 RVA: 00441c68 FileOffset: 0043fe68 CodeView format: RSDS <span style='color: blue; font-weight: bold'>Signature: {c99f0001-5928-49ad-a9a5-5a463ed5298a} Age: 1</span> PdbFile: mscorlib.pdb Debug information file: Format: PDB 7.00 <span style='color: blue; font-weight: bold'>Signature: {ed96a7f3-8a29-40f3-9b9c-a7ad9bc5cb67} Age: 2</span> Result: Unmatched (reason: Signature mismatch) </pre> <br /> 예상했던 대로 Signature 및 Age가 일치하지 않습니다. 그런데, 가만보니 PDB 파일의 signature가 심벌 파일을 다운로드한 바로 그 폴더명과 같다는 것을 알 수 있습니다.<br /> <br /> <img alt='netsrc_pdb_match_2.png' src='/SysWebRes/bbs/netsrc_pdb_match_2.png' /><br /> <br /> 아하... 그렇다면, 위에서 다운로드한 PDB 파일을 억지로 DLL의 "{c99f0001-5928-49ad-a9a5-5a463ed5298a}" signature와 를 일치시켜 준 다음, 폴더를 만들어주어도 가능할 것 같습니다. 그래서, DLL의 signature GUID 값과 일치하는 폴더를 새롭게 만들어 PDB 파일을 복사한 후,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > ".\MicrosoftPublicSymbols\mscorlib.pdb\<span style='color: blue; font-weight: bold'>C99F0001592849ADA9A55A463ED5298A</span>\mscorlib.pdb" </pre> <br /> chkmatch.exe 파일을 이용해서 다음과 같이 DLL과 PDB 파일의 signature를 강제로 일치시켜 줍니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > D:\pdb_match>chkmatch -m C:\Windows\Microsoft.NET\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e0 89\mscorlib.dll E:\NetPdbSources\MicrosoftPublicSymbols\mscorlib.pdb\C99F0001592849ADA9A55A463ED5298A\mscorlib.pdb ChkMatch - version 1.0 Copyright (C) 2004 Oleg Starodumov http://www.debuginfo.com/ Executable: C:\Windows\Microsoft.NET\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll Debug info file: E:\NetPdbSources\MicrosoftPublicSymbols\mscorlib.pdb\C99F0001592849ADA9A55A463ED5298A\mscorlib.pdb Executable: TimeDateStamp: 4e181ae3 Debug info: 2 ( CodeView ) TimeStamp: 4e181ae3 Characteristics: 0 MajorVer: 0 MinorVer: 0 Size: 37 RVA: 00441c68 FileOffset: 0043fe68 CodeView format: RSDS Signature: {c99f0001-5928-49ad-a9a5-5a463ed5298a} Age: 1 PdbFile: mscorlib.pdb Debug information file: Format: PDB 7.00 Signature: {ed96a7f3-8a29-40f3-9b9c-a7ad9bc5cb67} Age: 2 <span style='color: blue; font-weight: bold'>Writing to the debug information file... Result: Success.</span> </pre> <br /> 자, 이제 다음과 같이 Modules (Ctrl + D, M) 창에서 "Load Symbols From" / "Symbol Path" 메뉴를 선택하고, <br /> <br /> <img alt='netsrc_pdb_match_3.png' src='/SysWebRes/bbs/netsrc_pdb_match_3.png' /><br /> <br /> 경로를 다시 한번 물어볼 텐데, 직접 다음과 같이 PDB 파일 경로를 입력해 주면,<br /> <br /> <img alt='netsrc_pdb_match_4.png' src='/SysWebRes/bbs/netsrc_pdb_match_4.png' /><br /> <br /> 다음과 같이 "Symbols loaded." 상태로 바뀌는 것을 확인할 수 있습니다.<br /> <br /> <img alt='netsrc_pdb_match_5.png' src='/SysWebRes/bbs/netsrc_pdb_match_5.png' /><br /> <br /> (위의 과정까지 완료되고 나면, "Debug" / "Options and Settings" 창의 "Debugger" / "Symbols", "Symbol file (.pdb) locations:" 란에 새롭게 위의 경로가 추가됩니다.)<br /> <br /> <hr style='width: 50%' /><br /> <br /> 이미 이 글의 서두에서 말한 것 처럼, 위와 같이 해주고 나서 다시 디버깅을 해도 닷넷 프레임워크 소스 코드로 진입이 안되었습니다. 사실 ^^; <a target='tab' href='http://www.sysnet.pe.kr/2/0/1009'>"Visual Studio 2010 - .NET Framework 소스 코드 디버깅"</a> 글을 쓴 저조차도 내용을 잊어먹고 있었던 것입니다.<br /> <br /> 즉, PDB 파일이 "<a target='tab' href='http://referencesource.microsoft.com/symbols'>http://referencesource.microsoft.com/symbols</a>"와 "<a target='tab' href='http://msdl.microsoft.com/download/symbols'>http://msdl.microsoft.com/download/symbols</a>"의 2가지 경로에서 다운로드가 받아지는데요. 전자의 경우가 소스 코드 정보가 있는 것이고, 후자의 경우가 없는 것인데, 위에서 다운로드 되었던 PDB 파일은 후자에 속했던 것입니다.<br /> <br /> 이것은, 다운로드 시도를 하는 중에 fiddler2로 확인해 보면 알 수 있습니다.<br /> <br /> <img onclick='toggle_img(this)' class='imgView' alt='netsrc_pdb_match_6.png' src='/SysWebRes/bbs/netsrc_pdb_match_6.png' /><br /> <br /> 위에 보시면, System.Xml.Linq.pdb는 referencesource.microsoft.com으로부터 받았고, Microsoft.CSharp.pdb 파일은 referencesource.microsoft.com으로부터 "404 Not Found"로 실패해서 msdl.microsoft.com에서 받는 것을 볼 수 있습니다.<br /> <br /> 실제로, 해당 파일을 메모장으로만 열어보아도 다음과 같이 System.Xml.Linq.pdb 파일에서는 소스 코드 정보를 확인할 수 있는 반면, Microsoft.CSharp.pdb 파일에는 어떠한 소스 코드 정보도 찾을 수 없습니다.<br /> <br /> <img alt='netsrc_pdb_match_7.png' src='/SysWebRes/bbs/netsrc_pdb_match_7.png' /><br /> <br /> 어쨌든... 이런 결과로 인해 왜 소스 코드 디버깅이 안되는지에 대해서 이해는 되었지만... 결국, 마이크로소프트 측에서 정상적으로 PDB 심벌 파일 관리를 제대로 해주지 않아 발생하는 문제이기 때문에 더 해볼 것이 없습니다.<br /> <br /> 이렇게 된 이상... 믿을 것은 오직 ".NET Reflector"뿐인 것 같습니다. ^^<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > .NET Reflector를 이용한 "소스 코드가 없는" 어셈블리 디버깅 ; <a target='tab' href='http://www.sysnet.pe.kr/2/0/1201'>http://www.sysnet.pe.kr/2/0/1201</a> </pre> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
1565
(왼쪽의 숫자를 입력해야 합니다.)