Microsoft MVP성태의 닷넷 이야기
디버깅 기술: 5.10. Symbol Server 생성 [링크 복사], [링크+제목 복사],
조회: 37777
글쓴 사람
정성태 (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
정성태

... 166  167  168  169  170  [171]  172  173  174  175  176  177  178  179  180  ...
NoWriterDateCnt.TitleFile(s)
730정성태5/26/200927156VS.NET IDE: 63. Visual Studio 2010 - Parallel Stacks [1]
729정성태5/25/200926869.NET Framework: 138. InternalsVisibleTo와 Public Key 값
728정성태5/23/200937390.NET Framework: 137. C#에서 Union 구조체 다루기파일 다운로드1
727정성태5/22/200922345오류 유형: 82. 메서드가 많은 경우 프록시 클래스 생성 실패
726정성태5/21/200921871VS.NET IDE: 62. Visual Studio 2010 Beta1 버그 피드백 - EnC기능 오류 [1]
725정성태5/21/200925142VS.NET IDE: 61. Visual Studio 2010 베타1과 Visual Studio 2008의 혼합 개발 [2]
724정성태5/19/200939224.NET Framework: 136. 자바와 닷넷의 압축 호환파일 다운로드2
723정성태5/18/200933197.NET Framework: 135. C# - Deflate, GZip, Zip
722정성태5/18/200921775개발 환경 구성: 45. SQL 서버 2008 백업 구성 [2]
721정성태5/14/200927395오류 유형: 81. Package 실행 오류 - Error 15404
720정성태5/13/200924135오류 유형: 80. SQL Server 2008 - Package 실행 오류의 구체적인 원인 확인
719정성태5/12/200925326.NET Framework: 134. WPF - XBAP을 호스팅하고 있는 인터넷 익스플로러 인터페이스 구하기파일 다운로드1
717정성태5/11/200925569개발 환경 구성: 44. VHD 파일 크기 확장하는 방법 - 두 번째 이야기
714정성태5/7/200924140Windows: 45. Windows 7 RC와 함께 공개된 Windows Virtual PC 베타
713정성태4/30/200955931오류 유형: 79. DLL 'xxxxx.dll'을(를) 로드할 수 없습니다. [1]
712정성태4/28/200928546오류 유형: 78. Windows Vista/2008에서의 MSXML4.cab 파일 배포 문제
711정성태4/27/200928063개발 환경 구성: 43. Hyper-V VHD 파일 크기 확장하는 방법
710정성태4/26/200928712.NET Framework: 133. CallbackOnCollectedDelegate was detected [4]파일 다운로드1
709정성태4/24/200924922개발 환경 구성: 42. Windows Vista SP1에서 사용 가능한 Hyper-V 관리 도구
708정성태4/23/200929794.NET Framework: 132. ClickOnce 배포를 명령행 수작업 구성파일 다운로드1
707정성태4/22/200929435개발 환경 구성: 41. Hyper-V에 Linux 설치 - SUSE Linux Enterprise Server 11
706정성태4/21/200925286.NET Framework: 131. ClickOnce - 그룹화시켜 다운로드파일 다운로드1
705정성태4/20/200920813개발 환경 구성: 40. TFS2008 SP1의 DBTier에 SQL Server 2008 SP1 설치 [1]
704정성태4/19/200920796개발 환경 구성: 39. Together 2007 SP1 설치
702정성태4/18/200932080.NET Framework: 130. Infragistics - Tabbed MDI WPF 응용 프로그램파일 다운로드1
701정성태4/17/200926959Windows: 44. bootsect 오류 - Access is denied.
... 166  167  168  169  170  [171]  172  173  174  175  176  177  178  179  180  ...