Microsoft MVP성태의 닷넷 이야기
디버깅 기술: 5.10. Symbol Server 생성 [링크 복사], [링크+제목 복사],
조회: 37781
글쓴 사람
정성태 (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)
917정성태8/26/201021792개발 환경 구성: 86. "Routing and Remote Access"의 "Routing" 기능 활성화 방법
916정성태8/25/201021116개발 환경 구성: 85. 가상 네트워크에 LAN 어댑터 보이거나 감추는 방법
915정성태8/24/201039260개발 환경 구성: 84. Hyper-V의 네트워크 유형 (2)
913정성태8/22/201028341오류 유형: 104. Hyper-V 관리자 - VM 생성 오류 (VHD 생성 오류)
912정성태8/20/201030249.NET Framework: 183. 구조체 포인터 인자에 대한 P/Invoke 정의파일 다운로드1
911정성태8/19/201027116오류 유형: 103. System.Reflection.TargetException파일 다운로드1
910정성태8/19/201037936개발 환경 구성: 83. Hyper-V의 네트워크 유형 (1)
909정성태8/18/201033330오류 유형: 102. System.MissingMethodException
908정성태8/17/201024329개발 환경 구성: 82. Windows Virtual PC의 네트워크 유형 (3)
907정성태8/14/201021830개발 환경 구성: 81. Windows Virtual PC의 네트워크 유형 (2)
906정성태8/13/201030739개발 환경 구성: 80. Windows Virtual PC의 네트워크 유형 (1)
905정성태8/8/201032904Team Foundation Server: 39. 배치 파일로 팀 빌드 구성 [2]파일 다운로드1
904정성태8/8/201035659오류 유형: 101. SignTool Error: No certificates were found that met all the given criteria. [2]
903정성태8/6/201032523Team Foundation Server: 38. TFS 소스 코드 관리 기능 (4) - Branch
902정성태8/5/201024871Team Foundation Server: 37. TFS 2010의 소스 서버 수작업 구성
901정성태8/4/201024146Team Foundation Server: 36. TFS 소스 코드 관리 기능 (3) - Label
900정성태8/3/201026779Team Foundation Server: 35. TFS 소스 코드 관리 기능 (2) - Shelveset
899정성태8/2/201028858Team Foundation Server: 34. TFS 소스 코드 관리 기능 (1) - Changeset
898정성태7/31/201028381.NET Framework: 182. WCF의 InactivityTimeout [1]파일 다운로드1
897정성태7/26/201129601.NET Framework: 181. AssemblyVersion, AssemblyFileVersion, AssemblyInformationalVersion [4]
896정성태7/25/201036359.NET Framework: 180. C# Singleton 인스턴스 생성 [2]
895정성태7/25/201020245VS.NET IDE: 68. Visual Studio 2010 - .NET 1.1 원격 디버깅
894정성태7/25/201026159오류 유형: 100. Could not find the Database Engine startup handle. [1]
893정성태7/25/201027276오류 유형: 99. .NET 4.0 설치된 윈도우 7에서 SQL Server 2008 R2 설치 오류
892정성태7/9/201029057오류 유형: 98. 영문 윈도우에 한글 SQL Server 2008 R2 설치할 때 오류 [4]
891정성태7/8/201024876오류 유형: 97. MsiGetProductInfo failed to retrieve ProductVersion for package with Product Code = '{...}'. Error code: 1605. [2]
... 151  152  153  154  155  156  157  158  159  160  161  162  163  164  [165]  ...