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' 카테고리의 다른 글

System Hang 분석  (0) 2018.11.24
Symbol Server 설정 (공유, HTTP)  (0) 2018.03.04
[디버거 명령]!Mex.p  (0) 2017.09.25
[디버깅 명령]!mex.help  (0) 2017.09.24

Windows Server 2016은 가장 최신 Windows 라 그런지 새로운 기능에 대한 Fix가 아직 많은 것으로 보입니다.


February 13, 2018—KB4074590 (OS Build 14393.2068)

MPIO에서 IO에 대한 제약이 설정 되어 있을때 Path에 대한 Failover 발생시 모든 사용 가능한 Path가 Failed 될 수 있는 이슈가 수정 되었습니다.
  • Addresses issue where a failover in MPIO while throttling input and output requests may cause all available paths to fail.
KB4057142, KB4056890 를 SMB 파일 서버에 설치 하였을때 junction point와 volume mount point 접근시 발생하는 이슈가 수정 되었습니다.
  • Addresses issue where, after installing KB4057142 or KB4056890 on an SMB server, accessing files in directory junction points or volume mount points hosted on the server may fail. The error is “ERROR_INVALID_REPARSE_DATA”. For example, this symptom may be observed:



February 22, 2018—KB4077525 (OS Build 14393.2097)

WinRM event query 할때 발생하는 이슈가 수정 되었습니다.
  • Addresses issue where the WinRM event query returns the error "0x6c6 (RPC_S_INVALID_BOUND)" from the target server. The error appears when servers are configured to push their security event logs to a central server for analysis using a subscription.
File 전송을 할 때 tcpip.sys 에서 BugCheck 0xD1이 발생하면서 시스템이 크래시 되는 이슈가 수정 되었습니다.
  • Addresses issue where a server error occurs occasionally during file transfer. The error is “Stop D1 in tcpip!TcpSegmentTcbSend”.
iSCSI redirection 을 사용하였을때 BugCheck 0x9F가 발생하는 이슈가 수정 되었습니다.
  • Addresses issue where iSCSI target redirection during login may lead to stop error 9f.
MPIO를 사용할 때 Disk의 상태가 pending removal 일 경우 pass-through SCSI 요청이 멈출 수 있는 이슈가 수정 되었습니다.
  • Addresses issue in MPIO where pass-through SCSI requests may lead to a stop error if the disk is pending removal.
MPIO에서 Path를 선택하는 알고리즘이 수정 되었습니다.
  • Updates MPIO path selection algorithm to match the documentation when all paths are Active or Unoptimized.
NVMe 디바이서의 사용이 증가되면서 관련 이슈가 나오는 것으로 보입니다. 응용 프로그램을 시작할 때 StorNVMe 의 지연 기능으로 인해 CPU 사용량이 증가되는 이슈가 수정 되었습니다.
  • Addresses issue where a delay function in StorNVMe may cause a small CPU usage increase when launching applications.
ReFS 는 계속 사용 시나리오가 늘어 나면서 새로운 이슈들이 등장하고 새로운 튜닝 옵션들이 많이 증가하고 있습니다. ReFS를 백업 용도로 사용하는 Veeam 제품에서 Physical Memory에서 Metadata 영역이 메모리를 많이 사용하는 이슈가 있어서 fix가 나왔습니다. ReFS는 Allocate-on-write 방식으로 metadata를 관리하는데 metadata에 변경 사항이 있을때 기존 메모리를 변경하는 것이 아니고 새로운 메모리를 할당해서 쓰는 방식을 사용합니다. 이 방식을 사용하는 경우 변경사항이 있을 때마다 metadata용 메모리를 할당해야 해서 물리 메모리에 부하가 걸리게 됩니다.
  • Improves ReFS performance by more thoroughly unmapping multiple views of a file. See KB4090104 for additional tunable registry parameters to address large ReFS metadata streams.
  • Improves ReFS performance by removing idle containers from its hash table.
Unified Writer Filter (예전에 PC방에서 사용하던 하드디스크 보안관 같은 기능으로 디스크에 대한 쓰기가 별도의 공간으로 리디렉트 되는 것입니다.) 를 사용할 때 BugCheck 0xE1 (WORKER_THREAD_RETURNED_AT_BAD_IRQL)이 발생하는 이슈가 수정 되었습니다.
  • Addresses issue where booting with Unified Write Filter and a connected USB hub may lead to stop error E1.
SDN 관련 이슈도 보고 되었네요 이 이슈는 Azure Stack에도 적용되지 않을까 싶습니다.
  • Cleans the public IP with the correct information for the SDN Network Manager.
Deduplication 기능이 나왔을때 가장 걱정 했던 이슈가 파일이 손상되는 것인데 2.2TB 정도 되는 파일에 이슈가 있었습니다.
  • Addresses issue where a file that is optimized and is less than 2.2 TB may be corrupted by the Dedup process when the file is updated to exceed 2.2 TB.
  • Addresses issue where a file is always marked as corrupted—even though it isn't—when running a full Dedup scrub on a file larger than 2.2 TB.




Windows Server 2012 R2는 2018년 1, 2월에 중요 업데이트가 없습니다.

+ Recent posts