Microsoft MVP성태의 닷넷 이야기
디버깅 기술: 5.10. Symbol Server 생성 [링크 복사], [링크+제목 복사],
조회: 37924
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 
부모글 보이기/감추기
(연관된 글이 5개 있습니다.)

8. Symbol Server 생성

아마도 여러분들 중에는 왜 PDB 파일을 관리하기 위해 굳이 Symbol Server를 두어야 하는지에 대해 의문을 가지시는 분들도 계실 것입니다. 사실, 제 생각에도 프로젝트의 성격에 따라서는 Symbol Server를 생성할 필요없이 간단하게 나름대로 버전별 PDB 파일을 유지하는 것도 좋은 방법이 될 수 있다고 봅니다.
만약 여러분들이 만든 프로그램을 고객이 사용하다가 문제가 발생했을 경우, 항상 최신의 모듈과 PDB 파일을 보내줄 수 있는 경우에도 굳이 Symbol Server까지 생성할 필요는 없을 것입니다. 그렇지 않고, 그 이외의 상황에 놓인 분들이라면 Symbol Server를 구축하는 것에 대해 충분히 고려해 볼 여지가 있을 것 같습니다.

Symbol Server를 구축해 두면, 여러분들은 고객으로부터 받게 되는 미니 덤프 파일에 대해 별도의 PDB 경로를 지정해야 하는 수고로움을 덜을 수 있습니다. 물론, 고객이 사용하고 있던 모듈의 빌드 버전에 맞는 PDB 파일을 일일이 찾아야 하는 번거로움도 없어지게 되지요.
또한, 팀내의 다른 사람, 또는 고객이 직접 해당 PDB 파일을 사용하여 디버깅을 하도록 기능을 제공하고 싶다면, 단지 Symbol Server 주소를 알려주는 것으로 끝나게 됩니다. 결국 여러 모로 개발자 여러분들의 삶을 편안하게 해줄 수 있는 것이 바로 "Symbol Server"인 것입니다.

이를 구축하기 위해서는, 아래의 WinDBG 토픽에서 설명한 데로, "Debugging Tools for Windows"를 설치해야 합니다. 70MB 용량으로 더 없이 훌륭한 디버깅 기능을 제공해 주기 때문에, 설령 쓰지 않더라도 동료 개발자를 긴장시키기 위해 가끔 한번이라도 실행해 보는 용도로도 그만일 것입니다. ^^

커널 구조체 살펴보기

사실, Symbol Server 구축은 그다지 어려운 주제는 아닙니다. 문제는, 이 글을 읽고 난 후의 여러분들의 자세입니다. 바라건데, 적어도 이 글을 읽은 분들이라면 자신의 개발팀 만큼은 적절한 "Symbol Server" 관리를 꼭 하셨으면 좋겠습니다.

그럼, 이제 찬찬히 따라가 볼까요? ^^



1. 제품에 대해 PDB 파일을 쌓아둘 서버를 선정합니다. 가능한 하드 디스크 용량이 넉넉하고, http로 외부에 노출시킬 수 있는 컴퓨터를 선정하시기 바랍니다. 내부에서만 사용될 용도라면 공인 IP를 가지고 있을 필요까지는 없겠지요.
일단, 그 컴퓨터의 URL이 "www.sysnet.pe.kr"이고, 컴퓨터 이름은 "w2003ayukon"이라고 가정하겠습니다.

2. Symbol 파일들이 저장될 폴더 경로를 정합니다. 여기에서는 "\\w2003ayukon\LibSymbols"라고 정하겠습니다. 이 폴더를 접근하기 위한 HTTP 경로는 "https://www.sysnet.pe.kr/LibSymbols"입니다.

3. 여러분의 제품을 빌드한 폴더에서 "*.dll; *.pdb; *.exe"에 해당하는 파일들을 별도의 폴더에 보관합니다. 예를 들어, 해당 파일들을 "D:\temp2\PdbSample\Symbols" 폴더에 복사했다고 가정하겠습니다.

4. 이제, "D:\temp2\PdbSample\Symbols" 폴더에 존재하는 바이너리 파일들을 "\\w2003ayukon\LibSymbols" 폴더에 "Symbol Server" 역할을 할 수 있도록 저장해 보겠습니다. 이를 위해서 "C:\Program Files\Debugging Tools for Windows\symstore.exe" 파일을 이용하는 다음과 같은 배치 파일을 만듭니다.

symstore add /r /f D:\temp2\PdbSample\Symbols\*.* /s \\w2003ayukon\LibSymbols /t "TestLib" /v "1,0,0,0"

형식을 풀어보면 다음과 같습니다.

symstore add /r /f [Symbol 서버에 저장될 바이너리 파일 지정] /s [Symbol 서버 경로] /t [임의의 제품명] /v [임의의 버전 문자열]

5. 제품이 릴리스 될 때마다, 또는 의미있는 빌드로 공개될 때마다 여러분들은 해당 바이너리들에 대해 위와 같이 Symbol Server에 저장해 두어야 합니다. 이것이 Symbol Server를 구축하는 방법에 대한 모든 설명입니다.

지금까지 보여드렸던 WinForm App를 위와 같은 단계를 거치는 경우, 최종적으로 다음과 같이 구성되어져 있어야 합니다.

C:\Program Files\SysNET\SmallTool>symstore add /r /f D:\temp2\PdbSample\Symbols\*.* /s \\w2003ayukon\LibSymbols /t "TestLib" /v "1,0,0,0"
Finding ID...  0000000001

SYMSTORE: Number of files stored = 4
SYMSTORE: Number of errors = 0
SYMSTORE: Number of files ignored = 0

위와 같이 명령을 실행한 결과 다음과 같이 폴더가 생성되어져 있어야 합니다.

PDB 구성 파일 시스템

아울러, 인터넷 정보 관리자에서는 아래와 같이 보여져야 합니다.

IIS 관리자에서 본 PDB 구성

위와 같이 웹 서버를 이용해서 심벌 파일을 내려받게 하고 싶은 경우에는, PDB/EXE/DLL 파일들에 대해서 다음과 같이 Mime-Type을 별도로 추가해 주어야 합니다.
(보안상, 반드시 LibSymbols 가상 디렉토리에만 이 설정을 하도록 합니다.)

MimeType 설정



이제, 남은 것은 여러분들이 구축한 실제 Symbol 서버를 어떻게 사용하는 지에 대한 방법입니다. 사실, 이 부분은 지난 토픽이었던 "3.7. Microsoft 의 PDB 파일 관리"
를 보시면 아실 수 있는 부분인데요. 복습 겸 실습을 위해서 다시 한번 위의 환경 설정을 가지고 설명해 보도록 하겠습니다.

우선 상황을 가정해보면, 여러분들은 라이브러리 개발자이고 위와 같은 구성을 통해서 이미 심벌 서버를 마련해 둔 상태입니다.
동료 개발자들이 여러분이 만든 라이브러리를 사용하고 있으며, 어느 순간 문제가 발생되어서 디버깅을 요청이 들어왔습니다.
다행히 그 동료 개발자는 여러분들과 함께 제 웹사이트에 연재된 "PDB 이야기"를 정독했기 때문에 ^^ 심벌 서버의 URL을 알려주는 것으로 마무리 할 수 있습니다.
(만약, 그 동료 개발자가 아직 "PDB 이야기"를 읽어 보지 않았다 해도 간단합니다. 그런 경우에는 "PDB 이야기" URL과 함께 심벌 서버의 URL을 알려주기만 하면 됩니다. ^^; 그런데, 그 개발자가 그냥 직접 해서 결과만 알려달라고 말한다면? 그런 경우에는 "http://blog.naver.com/saltynut/120027616587" URL을 알려주시고 4번 항목을 읽어보라고 하십시오. 그랬는데도 심경의 변화가 없다면...? OTL)

자, 이제 적어도 여러분들은 계속해서 여러분들의 업무에 집중할 수 있으며, 동료 개발자는 가장 오류 정보를 확실하게 얻을 수 있는 자신의 개발 환경에서 디버깅을 할 수 있게 되었습니다.
잘 배운데로, 동료 개발자는 우선 다음과 같이 "_NT_SYMBOL_PATH" 환경 변수를 설정할 것입니다.

*** 원래는 한줄입니다. ***
SRV*\\localhost\d$\Symbol\OSSymbols*http://msdl.microsoft.com/download/symbols;
SRV*\\localhost\d$\Symbol\TestSymbols*https://www.sysnet.pe.kr/LibSymbols;
C:\Windows\system32

이제 디버깅을 시작하면, 여러분들이 평소에 잘 저장해 두었던 PDB 파일들이 현재의 동료 개발자에게 보내졌던 라이브러리 버전에 맞게 "D:\Symbol\TestSymbols" 폴더에 다운로드 되어지는 것을 확인할 수 있습니다.
여러분들의 훌륭한 동료 개발자는 이제 문제가 해당 개발 환경상의 문제였는지? 여러분들의 코드가 문제였는지 짚어줄 것입니다.




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






[최초 등록일: ]
[최종 수정일: 7/5/2021]

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

비밀번호

댓글 작성자
 



2006-10-16 03시23분
[오규태] 좋은 자료를 공유해 주셔서 정말로 감사드립니다.
덕분에 많이 미흡하지만 어느정도 모양세를 갖춘 심볼서버를 구축하게 되었습니다.
정말로 좋은 정보 감사드립니다. 좋은 하루 되세요~
[guest]
2006-10-16 04시55분
사실, 저는 이것 저것 자료를 모은 것에 불과합니다. 암튼, 도움이 되셨다니... 다행입니다. ^^
kevin25
2011-04-02 12시37분
Debugging Series: Symbol Server
; (broken) http://blogs.msdn.com/b/camerons/archive/2011/04/01/debugging-series-symbol-server.aspx
; https://docs.microsoft.com/en-us/windows/win32/dxtecharts/debugging-with-symbols#symbol-servers
정성태
2013-05-21 01시13분
GitHub Source Symbol Indexer
; (broken) http://hamishgraham.net/post/GitHub-Source-Symbol-Indexer.aspx

Haemoglobin/GitHub-Source-Indexer
; https://github.com/Haemoglobin/GitHub-Source-Indexer
정성태

... 151  152  153  154  155  156  157  158  159  160  [161]  162  163  164  165  ...
NoWriterDateCnt.TitleFile(s)
1024정성태4/22/201129239오류 유형: 118. Windows 2008 서버에서 Event Viewer / PowerShell 실행 시 비정상 종료되는 문제 [1]
1023정성태4/20/201130137.NET Framework: 210. Windbg 환경에서 확인해 본 .NET 메서드 JIT 컴파일 전과 후 [1]
1022정성태4/19/201125679디버깅 기술: 38. .NET Disassembly 창에서의 F11(Step-into) 키 동작파일 다운로드1
1021정성태4/18/201128017디버깅 기술: 37. .NET 4.0 응용 프로그램의 Main 함수에 BreakPoint 걸기
1020정성태4/18/201128627오류 유형: 117. Failed to find runtime DLL (mscorwks.dll), 0x80004005
1019정성태4/17/201129253디버깅 기술: 36. Visual Studio의 .NET Disassembly 창의 call 호출에 사용되는 주소의 의미는? [1]파일 다운로드1
1018정성태4/16/201132911오류 유형: 116. 윈도우 업데이트 오류 - 0x8020000E
1017정성태4/14/201127723개발 환경 구성: 115. MSBuild - x86/x64, .NET 2/4, debug/release 빌드에 대한 배치 처리파일 다운로드1
1016정성태4/13/201143750개발 환경 구성: 114. Windows Thin PC 설치 [2]
1015정성태4/9/201129112.NET Framework: 209. AutoReset, ManualReset, Monitor.Wait의 차이파일 다운로드1
1014정성태4/7/2011106550오류 유형: 115. ORA-12516: TNS:listener could not find available handler with matching protocol stack [2]
1013정성태4/7/201124370Team Foundation Server: 45. SharePoint 2010 + TFS 2010 환경에서 ProcessGuidance.html 파일 다운로드 문제
1012정성태4/6/201133133.NET Framework: 208. WCF - 접속된 클라이언트의 IP 주소 알아내는 방법 [1]
1011정성태3/31/201135463오류 유형: 114. 인증서 갱신 오류 - The request contains no certificate template information.
1010정성태3/30/201126197개발 환경 구성: 113. 응용 프로그램 디자인 스케치 도구 - SketchFlow [4]
1009정성태3/29/201138579개발 환경 구성: 112. Visual Studio 2010 - .NET Framework 소스 코드 디버깅 [4]
1008정성태3/27/201130934.NET Framework: 207. C# - Right operand가 음수인 Shift 연산 결과 [2]
1007정성태3/16/201131799개발 환경 구성: 111. Excel - XML 파일 연동 [5]파일 다운로드1
1006정성태3/15/201125541.NET Framework: 206. XML/XSD - 외래키처럼 참조 제한 거는 방법파일 다운로드1
1005정성태3/11/201135349개발 환경 구성: 110. 엑셀 매크로 함수 관련 오류 [2]
1004정성태3/3/201124606개발 환경 구성: 109. SharePoint Health Analyzer 디스크 부족 경고 제어
1003정성태3/3/201125628오류 유형: 113. SQL Server - DB Attach 시 Parameter name: nColIndex 오류 발생
1002정성태3/2/201123929Team Foundation Server: 44. TFS 설치 후, Team Portal의 Dashboard를 빠르게 확인하는 방법
1001정성태3/2/201128030Team Foundation Server: 43. TFS 2010 + SharePoint 2010 설치
1000정성태3/1/201132997오류 유형: 112. Remote FX RDP 연결 시 오류 유형 2가지 [5]
999정성태2/28/201146561개발 환경 구성: 108. RemoteFX - Windows 7 가상 머신에서 DirectX 9c 환경을 제공 [5]
... 151  152  153  154  155  156  157  158  159  160  [161]  162  163  164  165  ...