SymStore 사용
SymStore(symstore.exe)는 기호 저장소를 만들기 위한 도구입니다. Windows용 디버깅 도구 패키지에 포함되어 있습니다.
SymStore는 디버거가 이미지의 타임스탬프와 크기(.dbg 또는 실행 파일의 경우) 또는 서명과 기간(.pdb 파일의 경우)에 따라 기호를 조회할 수 있는 형식으로 기호를 저장합니다. 기존 기호 스토리지 형식에 비해 기호 저장소의 장점은 모든 기호를 동일한 서버에서 저장하거나 참조할 수 있으며 해당 기호가 포함된 제품에 대한 사전 지식 없이 디버거에서 기호를 검색할 수 있다는 것입니다.
여러 버전의 .pdb 기호 파일(예: 퍼블릭 및 프라이빗 버전)은 각각 동일한 서명과 기간을 포함하므로 동일한 서버에 저장할 수 없습니다.
SymStore 트랜잭션
SymStore에 대한 모든 호출은 트랜잭션으로 기록됩니다. 트랜잭션에는 추가 및 삭제의 두 가지 유형이 있습니다.
기호 저장소가 만들어지면 서버 루트 아래에 “000admin”이라는 디렉터리가 생성됩니다. 000admin 디렉터리에는 트랜잭션당 하나의 파일과 Server.txt 및 History.txt 로그 파일이 포함됩니다. Server.txt 파일에는 현재 서버에 있는 모든 트랜잭션 목록이 포함됩니다. History.txt 파일에는 모든 트랜잭션의 시간 기록이 포함됩니다.
SymStore가 기호 파일을 저장하거나 제거할 때마다 새 트랜잭션 번호가 생성됩니다. 그런 다음, 이름이 이 트랜잭션 번호인 파일이 000admin으로 만들어집니다. 이 파일에는 해당 트랜잭션 중에 기호 저장소에 추가된 모든 파일 또는 포인터 목록이 포함됩니다. 트랜잭션이 삭제되면 SymStore는 해당 트랜잭션 파일을 읽어서 삭제해야 하는 파일과 포인터를 확인합니다.
add 및 del 옵션은 추가 또는 삭제 트랜잭션을 수행할지 여부를 지정합니다. 추가 작업에 /p 옵션을 포함하면 포인터를 추가하도록 지정됩니다. /p 옵션을 생략하면 실제 기호 파일을 추가하도록 지정됩니다.
두 단계로 기호 저장소를 만들 수도 있습니다. 첫 번째 단계에서는 /x 옵션과 함께 SymStore를 사용하여 인덱스 파일을 만듭니다. 두 번째 단계에서는 /y 옵션과 함께 SymStore를 사용하여 인덱스 파일의 정보에서 파일 또는 포인터의 실제 저장소를 만듭니다.
이는 다양한 이유로 유용한 기술이 될 수 있습니다. 예를 들어 이 기술을 사용하면 인덱스 파일이 계속 존재하는 한 저장소가 손실된 경우 기호 저장소를 쉽게 다시 만들 수 있습니다. 또는 기호 파일이 포함된 컴퓨터는 기호 저장소가 만들어질 컴퓨터에 대한 네트워크 연결이 느려질 수 있습니다. 이 경우 기호 파일과 동일한 컴퓨터에 인덱스 파일을 만들고, 인덱스 파일을 두 번째 컴퓨터로 전송한 다음, 두 번째 컴퓨터에 저장소를 만들 수 있습니다.
모든 SymStore 매개 변수의 전체 목록은 SymStore 명령줄 옵션을 참조하세요.
참고
SymStore는 여러 사용자의 동시 트랜잭션을 지원하지 않습니다. 한 명의 사용자가 기호 저장소의 “관리자”로 지정되고 모든 add 및 del 트랜잭션을 처리하는 것이 좋습니다.
트랜잭션 예제
다음은 Windows Server 2003 빌드 3790에 대한 기호 포인터를 \\sampledir\symsrv에 추가하는 SymStore의 두 가지 예제입니다.
symstore add /r /p /f \\BuildServer\BuildShare\3790free\symbols\*.*
/s \\sampledir\symsrv /t "Windows Server 2003" /v "Build 3790 x86 free"
/c "Sample add"
symstore add /r /p /f \\BuildServer\BuildShare\3790Chk\symbols\*.*
/s \\sampledir\symsrv /t "Windows Server 2003" /v "Build 3790 x86 checked"
/c "Sample add"
다음 예제에서 SymStore는 \\largeapp\appserver\bins의 애플리케이션 프로젝트에 대한 실제 기호 파일을 \\testdir\symsrv에 추가합니다.
symstore add /r /f \\largeapp\appserver\bins\*.* /s \\testdir\symsrv
/t "Large Application" /v "Build 432" /c "Sample add"
다음은 인덱스 파일을 사용하는 방법의 예제입니다. 먼저 SymStore는 \\largeapp\appserver\bins\의 기호 파일 컬렉션을 기반으로 인덱스 파일을 만듭니다. 이 경우 인덱스 파일은 세 번째 컴퓨터인 \\hubserver\hubshare에 배치됩니다. /g 옵션을 사용하여 파일 접두사 “\\largeapp\appserver”가 나중에 변경될 수 있도록 지정합니다.
symstore add /r /p /g \\largeapp\appserver /f
\\largeapp\appserver\bins\*.*
/x \\hubserver\hubshare\myindex.txt
이제 \\largeapp\appserver 컴퓨터에서 모든 기호 파일을 이동하고 \\myarchive\appserver에 배치한다고 가정합니다. 그런 다음, 다음과 같이 \\hubserver\hubshare\myindex.txt 인덱스 파일에서 기호 저장소 자체를 만들 수 있습니다.
symstore add /y \\hubserver\hubshare\myindex.txt
/g \\myarchive\appserver /s \\sampledir\symsrv /p
/t "Large Application" /v "Build 432" /c "Sample Add from Index"
마지막으로, 이전 트랜잭션에서 추가한 파일을 삭제하는 SymStore의 예제는 다음과 같습니다. 트랜잭션 ID를 확인하는 방법에 대한 설명은 다음 섹션을 참조하세요(이 경우 0000000096).
symstore del /i 0000000096 /s \\sampledir\symsrv
압축 파일
SymStore는 두 가지 방법으로 압축 파일과 함께 사용할 수 있습니다.
- /p 옵션과 함께 SymStore를 사용하여 기호 파일에 대한 포인터를 저장합니다. SymStore가 완료된 후 포인터가 참조하는 파일을 압축합니다.
- /x 옵션과 함께 SymStore를 사용하여 인덱스 파일을 만듭니다. SymStore가 완료된 후 인덱스 파일에 나열된 파일을 압축합니다. 그런 다음, /y 옵션(및 원하는 경우 /p 옵션)과 함께 SymStore를 사용하여 기호 저장소에 파일 및 파일에 대한 포인터를 저장합니다. (SymStore는 이 작업을 수행하기 위해 파일의 압축을 풀 필요가 없습니다.)
기호 서버는 필요할 때 파일의 압축을 풀어야 합니다.
SymSrv를 기호 서버로 사용하는 경우 Microsoft Windows SDK(소프트웨어 개발 키트)와 함께 배포되는 compress.exe 도구를 사용하여 압축을 수행해야 합니다. 압축 파일은 파일 확장명 마지막에 밑줄이 있어야 합니다(예: module1.pd_ 또는 module2.db_). 자세한 내용은 SymSrv 사용을 참조하세요.
server.txt 및 history.txt 파일
트랜잭션이 추가될 때 향후 조회 기능을 위해 여러 가지 정보 항목이 server.txt 및 history.txt에 추가됩니다. 다음은 추가 트랜잭션에 대한 server.txt 및 history.txt 줄의 예제입니다.
0000000096,add,ptr,10/09/99,00:08:32,Windows XP,x86 fre 1.156c-RTM-2,Added from \\mybuilds\symbols,
이는 쉼표로 구분된 줄입니다. 필드는 다음과 같이 정의됩니다.
필드 | 설명 |
---|---|
0000000096 | SymStore에서 만든 트랜잭션 ID 번호입니다. |
add | 트랜잭션 유형입니다. 이 필드는 add 또는 del일 수 있습니다. |
ptr | 파일 또는 포인터가 추가되었는지 여부입니다. 이 필드는 file 또는 ptr일 수 있습니다. |
10/09/99 | 트랜잭션이 발생한 날짜입니다. |
00:08:32 | 트랜잭션이 시작된 시간입니다. |
Windows XP | 제품 |
x86 fre | 버전(선택 사항)입니다. |
Added from | 설명(선택 사항)입니다. |
사용 안 함 | (나중에 사용하도록 예약되었습니다.) |
다음은 트랜잭션 파일 0000000096의 일부 샘플 줄입니다. 각 줄은 디렉터리와 디렉터리에 추가된 파일 또는 포인터의 위치를 기록합니다.
canon800.dbg\35d9fd51b000,\\mybuilds\symbols\sp4\dll\canon800.dbg
canonlbp.dbg\35d9fd521c000,\\mybuilds\symbols\sp4\dll\canonlbp.dbg
certadm.dbg\352bf2f48000,\\mybuilds\symbols\sp4\dll\certadm.dbg
certcli.dbg\352bf2f1b000,\\mybuilds\symbols\sp4\dll\certcli.dbg
certcrpt.dbg\352bf04911000,\\mybuilds\symbols\sp4\dll\certcrpt.dbg
certenc.dbg\352bf2f7f000,\\mybuilds\symbols\sp4\dll\certenc.dbg
del 트랜잭션을 사용하여 원래 add 트랜잭션을 실행 취소하면 이러한 줄이 server.txt에서 제거되고 다음 줄이 history.txt에 추가됩니다.
0000000105,del,0000000096
삭제 트랜잭션의 필드는 다음과 같이 정의됩니다.
필드 | 설명 |
---|---|
0000000105 | SymStore에서 만든 트랜잭션 ID 번호입니다. |
del | 트랜잭션 유형입니다. 이 필드는 add 또는 del일 수 있습니다. |
0000000096 | 삭제된 트랜잭션입니다. |
기호 스토리지 형식
SymStore는 파일 시스템 자체를 데이터베이스로 사용합니다. 기호 파일 타임스탬프로, 서명, 기간 및 기타 데이터와 같은 항목을 기반으로 디렉터리 이름을 사용하여 큰 디렉터리 트리를 만듭니다.
예를 들어 여러 개의 다른 acpi.dbg 파일이 서버에 추가된 후 디렉터리가 다음과 같이 표시될 수 있습니다.
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
10/04/1999 12:45p <DIR> 37ed151662060
10/04/1999 12:39p <DIR> 37ed15dd27760
10/04/1999 11:33a <DIR> 37f03ce962020
10/04/1999 11:21a <DIR> 37f03cf7277c0
10/06/1999 05:38p <DIR> 37fa7f00277e0
10/06/1999 05:46p <DIR> 37fa7f01620a0
이 예제에서 acpi.dbg 기호 파일의 조회 경로는 \\mybuilds\symsrv\acpi.dbg\37cdb03962040과 같이 표시될 수 있습니다.
조회 디렉터리 내에 다음 세 개의 파일이 있을 수 있습니다.
- 파일이 저장된 경우 acpi.dbg가 있습니다.
- 포인터가 저장된 경우 file.ptr이라는 파일이 있고 실제 기호 파일의 경로를 포함합니다.
- refs.ptr이라는 파일로, 현재 기호 저장소에 추가된 이 타임스탬프 및 이미지 크기가 있는 acpi.dbg에 대한 모든 현재 위치 목록을 포함합니다.
\\mybuilds\symsrv\acpi.dbg\37cdb03962040의 디렉터리 목록을 표시하면 다음이 제공됩니다.
10/04/1999 01:54p 52 file.ptr
10/04/1999 01:54p 67 refs.ptr
file.ptr 파일에는 “\\mybuilds\symbols\x86\2128.chk\symbols\sys\acpi.dbg” 텍스트 문자열이 포함됩니다. 이 디렉터리에 acpi.dbg라는 파일이 없으므로 디버거는 \\mybuilds\symbols\x86\2128.chk\symbols\sys\acpi.dbg에서 파일을 찾으려고 시도합니다.
refs.ptr의 콘텐츠는 디버거가 아닌 SymStore에서만 사용됩니다. 이 파일에는 해당 디렉터리에서 발생한 모든 트랜잭션의 레코드가 포함됩니다. refs.ptr의 샘플 줄은 다음과 같습니다.
0000000026,ptr,\\mybuilds\symbols\x86\2128.chk\symbols\sys\acpi.dbg
\\mybuilds\symbols\x86\2128.chk\symbols\sys\acpi.dbg에 대한 포인터가 트랜잭션 “0000000026”과 함께 추가되었음을 보여 줍니다.
일부 기호 파일은 다양한 제품이나 빌드 또는 특정 제품에서 일관되게 유지됩니다. 이에 대한 하나의 예제는 msvcrt.pdb 파일입니다. \\mybuilds\symsrv\msvcrt.pdb 디렉터리를 실행하면 msvcrt.pdb의 두 버전만 기호 서버에 추가되었음을 알 수 있습니다.
Directory of \\mybuilds\symsrv\msvcrt.pdb
10/06/1999 05:37p <DIR> .
10/06/1999 05:37p <DIR> ..
10/04/1999 11:19a <DIR> 37a8f40e2
10/06/1999 05:37p <DIR> 37f2c2272
그러나 \\mybuilds\symsrv\msvcrt.pdb\37a8f40e2 디렉터리를 실행하면 refs.ptr에 여러 포인터가 있음을 알 수 있습니다.
Directory of \\mybuilds\symsrv\msvcrt.pdb\37a8f40e2
10/05/1999 02:50p 54 file.ptr
10/05/1999 02:50p 2,039 refs.ptr
\\mybuilds\symsrv\msvcrt.pdb\37a8f40e2\refs.ptr의 콘텐츠는 다음과 같습니다.
0000000001,ptr,\\mybuilds\symbols\x86\2137\symbols\dll\msvcrt.pdb
0000000002,ptr,\\mybuilds\symbols\x86\2137.chk\symbols\dll\msvcrt.pdb
0000000003,ptr,\\mybuilds\symbols\x86\2138\symbols\dll\msvcrt.pdb
0000000004,ptr,\\mybuilds\symbols\x86\2138.chk\symbols\dll\msvcrt.pdb
0000000005,ptr,\\mybuilds\symbols\x86\2139\symbols\dll\msvcrt.pdb
0000000006,ptr,\\mybuilds\symbols\x86\2139.chk\symbols\dll\msvcrt.pdb
0000000007,ptr,\\mybuilds\symbols\x86\2140\symbols\dll\msvcrt.pdb
0000000008,ptr,\\mybuilds\symbols\x86\2140.chk\symbols\dll\msvcrt.pdb
0000000009,ptr,\\mybuilds\symbols\x86\2136\symbols\dll\msvcrt.pdb
0000000010,ptr,\\mybuilds\symbols\x86\2136.chk\symbols\dll\msvcrt.pdb
0000000011,ptr,\\mybuilds\symbols\x86\2135\symbols\dll\msvcrt.pdb
0000000012,ptr,\\mybuilds\symbols\x86\2135.chk\symbols\dll\msvcrt.pdb
0000000013,ptr,\\mybuilds\symbols\x86\2134\symbols\dll\msvcrt.pdb
0000000014,ptr,\\mybuilds\symbols\x86\2134.chk\symbols\dll\msvcrt.pdb
0000000015,ptr,\\mybuilds\symbols\x86\2133\symbols\dll\msvcrt.pdb
0000000016,ptr,\\mybuilds\symbols\x86\2133.chk\symbols\dll\msvcrt.pdb
0000000017,ptr,\\mybuilds\symbols\x86\2132\symbols\dll\msvcrt.pdb
0000000018,ptr,\\mybuilds\symbols\x86\2132.chk\symbols\dll\msvcrt.pdb
0000000019,ptr,\\mybuilds\symbols\x86\2131\symbols\dll\msvcrt.pdb
0000000020,ptr,\\mybuilds\symbols\x86\2131.chk\symbols\dll\msvcrt.pdb
0000000021,ptr,\\mybuilds\symbols\x86\2130\symbols\dll\msvcrt.pdb
0000000022,ptr,\\mybuilds\symbols\x86\2130.chk\symbols\dll\msvcrt.pdb
0000000023,ptr,\\mybuilds\symbols\x86\2129\symbols\dll\msvcrt.pdb
0000000024,ptr,\\mybuilds\symbols\x86\2129.chk\symbols\dll\msvcrt.pdb
0000000025,ptr,\\mybuilds\symbols\x86\2128\symbols\dll\msvcrt.pdb
0000000026,ptr,\\mybuilds\symbols\x86\2128.chk\symbols\dll\msvcrt.pdb
0000000027,ptr,\\mybuilds\symbols\x86\2141\symbols\dll\msvcrt.pdb
0000000028,ptr,\\mybuilds\symbols\x86\2141.chk\symbols\dll\msvcrt.pdb
0000000029,ptr,\\mybuilds\symbols\x86\2142\symbols\dll\msvcrt.pdb
0000000030,ptr,\\mybuilds\symbols\x86\2142.chk\symbols\dll\msvcrt.pdb
이는 \\mybuilds\symsrv에 저장된 여러 기호 빌드에 동일한 msvcrt.pdb가 사용되었음을 보여 줍니다.
다음은 파일 및 포인터 추가가 혼합되어 포함된 디렉터리의 예제입니다.
Directory of E:\symsrv\dbghelp.dbg\38039ff439000
10/12/1999 01:54p 141,232 dbghelp.dbg
10/13/1999 04:57p 49 file.ptr
10/13/1999 04:57p 306 refs.ptr
이 경우 refs.ptr에는 다음 콘텐츠가 포함됩니다.
0000000043,file,e:\binaries\symbols\retail\dll\dbghelp.dbg
0000000044,file,f:\binaries\symbols\retail\dll\dbghelp.dbg
0000000045,file,g:\binaries\symbols\retail\dll\dbghelp.dbg
0000000046,ptr,\\sampledir\bin\symbols\retail\dll\dbghelp.dbg
0000000047,ptr,\\sampledir2\bin\symbols\retail\dll\dbghelp.dbg
따라서 트랜잭션 43, 44 및 45는 서버에 동일한 파일을 추가하고 트랜잭션 46 및 47은 포인터를 추가했습니다. 트랜잭션 43, 44 및 45가 삭제되면 dbghelp.dbg 파일이 디렉터리에서 삭제됩니다. 그러면 디렉터리에는 다음 콘텐츠가 포함됩니다.
Directory of e:\symsrv\dbghelp.dbg\38039ff439000
10/13/1999 05:01p 49 file.ptr
10/13/1999 05:01p 130 refs.ptr
이제 file.ptr에는 “\\sampledir2\bin\symbols\retail\dll\dbghelp.dbg”가 포함되고 refs.ptr에는 다음이 포함됩니다.
0000000046,ptr,\\sampledir\bin\symbols\retail\dll\dbghelp.dbg
0000000047,ptr,\\sampledir2\bin\symbols\retail\dll\dbghelp.dbg
refs.ptr의 최종 항목이 포인터일 때마다 file.ptr 파일이 있고 연결된 파일의 경로를 포함합니다. refs.ptr의 최종 항목이 파일일 때마다 file.ptr이 이 디렉터리에 없습니다. 따라서 refs.ptr에서 최종 항목을 제거하는 삭제 작업으로 인해 file.ptr이 생성, 삭제 또는 변경될 수 있습니다.