WinDbg를 사용한 디버깅을 강의할 일이 있었는데 Release 한 제품에 대한 디버깅을 위해서 Symbol 서버를 구축해야 한다는 말씀들 드렸더니 SymStore 사용법이나 IIS 를 이용한 HTTP 기반의 Symbol server 구축에 대한 가이드가 있으면 좋겠다는 의견이 있어 이 블로그를 작성 하였습니다.

물론 저는 한번 구현해보는 수준으로 해본 것으로 실제 상용 제품의 Symbol Server를 구축 하시려고 하면 좀 더 고려할 것이 많을 것으로 보입니다.


SymStore 란?

SymStore는 심볼 저장소를 만드는 도구로 Debugging Tools for Windows 패키지에 포함되어 있습니다.
SymStore는 이미지의 타임 스탬프와 이미지 크기 또는 서명과 PDB 파일을 기간에 따라서 심볼을 찾을 수 있도록 심볼 파일을 보관 합니다.
SymStore를 사용하면 모든 심볼을 하나의 서버에 보관할 수 있으며 해당 제품이나 모듈에 대한 지식이 없이도 디버거가 심볼을 검색할 수 있습니다.
하지만 public 심볼과 private 실볼은 동일한 서명과 파일의 기간이 동일하기 때문에 동일한 서버에 보관할 수 없습니다.


SymStore 트랜잭션
SymStore은 add와 delete 라는 두 개의 트랜잭션이 있습니다.
심볼 저장소가 만들어지만 심볼 저장소로 사용되는 파일 서버의 파일 공유 루트에 000admin 이라는 폴더가 만들어지고 트랜잭션을 기록하는 파일이 트랜잭션당 하나 만들어 지고 Server.txt와 History.txt 파일이 만들어 집니다. Server.txt에는 현재 서버에 있는 모든 트랜잭션 목록이 들어 있고 History.txt에는 모든 트랜잭션의 기록이 시간순으로 있습니다.

add와 del 옵션을 사용해서 트랜잭션을 수행 합니다. /p 옵션을 사용하면 실제 파일이 추가되는 것이 아니고 파일에 대한 포인터가 추가된다고 하는데 별도의 심볼 서버를 운영하는 것이 더 간편하다고 생각되어 /p는 사용하지 않는게 나을 것으로 보입니다.

심볼 저장소를 만들 때 인덱스 파일과 실제 저장소를 나누어서 만들 수 있다고 되어 있으나 관리에 문제가 있으니 하나로 관리 하는 것이 더 좋다고 생각 됩니다. 대신 심볼 서버를 주기적으로 백업해주는 것이 좋을 것으로 생각 됩니다.

그리고 SymStore는 여러 사용자가 동시에 트랜잭션을 실행하는 것을 지원하지 않으므로 일일 빌드 또는 제품 출시를 위한 빌드에서 한 번만 수행하는 것이 좋습니다.


트랜잭션 예제
심볼 파일을 심볼 스토어에 추가하는 것은 아래와 같은 명령을 사용 합니다. MyApp 이라는 빌드 서버의 공유 폴더에서 심볼을 가져오는 것으로 되어 있는데 심볼 파일이 있는 경로에서 Symstore를 실행한다면 .\ 와 같은 경로를 지정할 수도 있습니다.
symstore add /r /f \\Myapp\appserver\x64\Release /s \\MySymServer\symsrv /t "My Application" /v "Build 001" /c "New Build"

트랜잭션을 삭제하는 것은 아래와 같이 트랜잭션 번호를 주어서 삭제할 수 있습니다.
symstore del /i 0000000001 /s \\MySymServer\symsrv

몇번 트랜잭션을 추가, 삭제 하였더니 아래와 같은 기록이 남았습니다.

Server.txt
0000000006,add,file,03/04/2018,16:34:40,"CreateProcess","1.0","The first build",

History.txt
0000000001,add,file,03/03/2018,15:46:26,"title","version","comment",
0000000002,add,file,03/03/2018,15:51:02,"title","version","comment",
0000000003,add,file,03/04/2018,16:15:24,"title","version info","comment",
0000000004,del,0000000001
0000000005,del,0000000002
0000000006,add,file,03/04/2018,16:34:40,"My Application","Build 001","New build",
0000000007,del,0000000003

그리고 0000000001 트랜잭션 파일에는 아래와 같이 기록이 남아 있습니다.
"appserver.exe\5A5ADF8B4f000","D:\MyApp\appserver\Release\appserver.exe"
"appserver.pdb\DAE2D118C40348C4981D98DF6D249C046","D:\MyApp\appserver\Release\appserver.pdb"


심볼 스토리지 포맷
Symstore는 파일 시스템 자체를 데이터베이스로 사용합니다. 심볼 파일 타임 스탬프, 서명, 파일 기간 그리고 다른 데이터를 사용하여 폴더 이름을 만들어서 관리 합니다.
아래 예는 SymStore 설명에 있는 예제 입니다.
Directory of \\mybuilds\symsrv\acpi.dbg
10/06/1999  05:46p      <DIR>          .
10/06/1999  05:46p      <DIR>          ..
10/04/1999  01:54p      <DIR>          37cdb03962040
10/04/1999  01:49p      <DIR>          37cdb04027740
10/04/1999  12:56p      <DIR>          37e3eb1c62060
10/04/1999  12:51p      <DIR>          37e3ebcc27760


심볼 파일은 SRV*c:\symbols*\\mybuilds\symsrv 와 같이 설정해주면 됩니다.


Web 기반 Symbol 서버 구축
1. Windows Server 2012 Standard 설치
2. IIS 설치
  2.1 Server Manager를 실행 한 후 우측 상단의 Manage - Add Roles and Features - Next - Next - Next - Web Server (IIS) - Web Server 선택 후
      Management Tools 에서 IIS Management Script and Tools 선택 하여 설치
  2.2 Web Server (IIS) - Web Server - Security - Windows Authentication 선택하여 설치
3. Server Manager에서 Tools 를 선택 후 Innetnet Information service (IIS) Manager 실행
4. C:\Symbols 폴더 만들기
5. 서버명 - sites - Default Web Site에서 오른쪽 마우스 클릭하여 Add Virtual Directory 선택 후 Alias 에 Symbols 입력하고 Path에 c:\Symbols 입력하고 OK
6. 서버명을 클릭한 후 가운데 Management 아래에 있는 Configuration Editor 더블 클릭
7. Section 에서 system.applicationHost - sites 선택 후 virtualDirectoryDefaults - allowSubDirConfig 를 False 로 변경
8. 서버명 - Sites - Default Web Site - Symbols 를 클릭한 후 IIS 아래에 있는 Directory Browsing 을 더블 클릭 한 후 Enable 선택
9. Default Web Site 를 클릭한 후 MIME Types 를 더블 클릭한 후 add 를 클릭하고 File name extension에 .* 룰 입력하고 MIME type에 application/octet-stream 입력하고
10. 서버명 - Sites - Default Web Site - Symbols 로 이동한 후 Authentication 더블 클릭후 Windows Authentication 만 Enable 하고 나머지는 Disable 함
   (만약 Windows Authentication이 없으면 2.2 과정에서 추가가 안 된 것임)
  10.1 Authentication - Windows Authentication 선택 후 우측의 Providers 선택한 후 Negotiate 를 선택 후 Remove 선택


WinDbg 설정
1. 인증을 처리할 수 있도록 prompts 설정합니다.
   !sym prompts on
2. 심볼 서버를 설정합니다.
  .sympath srv*c:\Mysymbols*http://192.168.1.51/sym;srv*c:\OSsymbols*https://msdl.microsoft.com/download/symbols


참고
Using SymStore
https://msdn.microsoft.com/en-us/library/windows/desktop/ms681417(v=vs.85).aspx

SymStore Command-Line Options
https://msdn.microsoft.com/en-us/library/windows/desktop/ms681378(v=vs.85).aspx

HTTP Symbol Stores
https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/http-symbol-stores

'Debugging' 카테고리의 다른 글

Windows Server 2003 BugCheck 0x7E  (0) 2019.01.26
System Hang 분석  (0) 2018.11.24
[디버거 명령]!Mex.p  (0) 2017.09.25
[디버깅 명령]!mex.help  (0) 2017.09.24

+ Recent posts