Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 

ssindex.cmd 실행 시 '...[tfs_collection_url]...' not found in srcsrv.ini 오류 발생

소스 서버가 뭔지에 대해서는 예전에 설명해 드린 적이 있지요? ^^

TFS Team Build + Source Server = 소스 코드 디버깅
; https://www.sysnet.pe.kr/2/0/600

그런데 ssindex.cmd를 실행하는 과정에서 다음과 같은 오류가 발생하는 경우가 있습니다.

D:\Sources>perl -w -x "%ProgramFiles(x86)%\Debugging Tools for Windows (x86)\srcsrv\ssindex.cmd" -SYSTEM=TFS -SYMBOLS="d:\sources\bin\release" -SOURCE=d:\sources
--------------------------------------------------------------------------------

ssindex.cmd [STATUS] : Server ini file: C:\Program Files (x86)\Debugging Tools for Windows (x86)\srcsrv\srcsrv.ini
ssindex.cmd [STATUS] : Source root    : d:\sources"
ssindex.cmd [STATUS] : Symbols root   : d:\sources\bin\Release
ssindex.cmd [STATUS] : Control system : TFS
ssindex.cmd [STATUS] : TFS program name: tf.exe
ssindex.cmd [STATUS] : TFS Label      : <N/A>
ssindex.cmd [STATUS] : Old path root  : <N/A>
ssindex.cmd [STATUS] : New path root  : <N/A>
--------------------------------------------------------------------------------

ssindex.cmd [STATUS] : Running... this will take some time...
ssindex.cmd [STATUS] : http://localhost:8083/tfs/defaultcollection not found in srcsrv.ini. Skipping all files in database.

이 오류가 발생하는 원인은, srcsrv.ini에 기재한 "MYSERVER" 항목의 값과 ssindex.cmd 내부에서 호출하는 tfs.pm의 반환값이 다르기 때문입니다. 예를 들어, srcsrv.ini에는 다음과 같이 기재하고,

[variables]
MYSERVER=https://guesttfs3.testhvpc.com:8084

tfs.pm은 내부적으로 다시 "tf.exe workfold"의 반환값으로 TFS 서버의 주소를 알아내는데,

D:\Sources>tf.exe workfold
===============================================================================
Workspace : TESTPC (TestUser)
Collection: https://localhost:8080/tfs/defaultcollection
 $/TestProgram: D:\Sources

보시는 바와 같이 "Collection"의 값과 "MYSERVER" 항목의 값이 다릅니다.

이런 경우, 문제 해결책은 MYSERVER의 값을 바꾸거나 "tf.exe workfold"가 MYSERVER에 기재한 값과 동일한 내용을 반환하도록 수정해야 합니다. 가장 편한 것은 MYSERVER의 값을 바꾸면 좋겠으나, 위와 같은 경우에는 "Collection:"의 반환값 주소가 "localhost"이기 때문에 소스 서버 접근을 외부에서 할 수 없다는 것이 되므로 "tf.exe workfold"의 결과값을 바꾸는 쪽을 선택해야 합니다.

"tf workfold"는 실행시 그 값을 다음의 폴더에 있는 파일로부터 가져와서 출력하는 역할만 합니다.

%LOCALAPPDATA%\Microsoft\Team Foundation\5.0\Cache

위의 폴더에 있는 적절한 파일을 찾아 바꾸면 좋겠지만, 사실 이 폴더는 캐시의 역할밖에 없어서 지우면 바꾸기 이전의 값으로 새롭게 생성됩니다. 따라서, 그 기반의 값을 고쳐야 하는데요. 그 값은 다음의 레지스트리 값에 기반합니다.

HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\12.0\TeamFoundation\Instances\localhost
Uri ==  http://localhost:8083/tfs

HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\12.0\TeamFoundation\Instances\localhost\DefaultCollection
Uri ==  http://localhost:8083/tfs/defaultcollection

하지만, 이 값을 직접 고치기보다는 아예 새롭게 TFS 서버를 등록하는 식으로 해결하는 것이 더 깔끔합니다. 가령, Visual Studio를 실행하고 "Team Explorer"에서 다음과 같이 srcsrv.ini에 기재한 MYSERVER의 값과 동일한 주소로 연결하는 항목을 포함하는 것입니다.

tfs_public_1.png

등록 후, "tf workfold" 명령어로 출력 결과를 확인해 보면 잘 바뀌었는지 알 수 있습니다.

D:\Sources>tf.exe workfold
===============================================================================
Workspace : TESTPC (TestUser)
Collection: https://guesttfs3.testhvpc.com:8084/tfs/defaultcollection
 $/TestProgram: D:\Sources

이후 다시 ssindex.cmd를 실행하면 정상적으로 소스 서버가 인덱싱되는 것을 확인할 수 있습니다.




한 가지 주의할 것은, "MYSERVER"의 항목과 "tf.exe workfold"가 출력한 Collection의 경로가 일치해야 합니다. 예를 들어, 다음과 같은 상황에서도 정상적으로 동작하지 않습니다.

MYSERVER == http://yoururl:8080/tfs/defaultcollection/
Collection: http://yoururl:8080/tfs/defaultcollection

MYSERVER의 끝에 '/' 문자가 있기 때문에 2개의 항목이 다르다고 판단하기 때문입니다.




팁을 하나 말씀드리면, ssindex.cmd의 인자에 /debug 옵션을 줄 수가 있습니다. 그럼, 다음과 같이 실행 여부를 좀 더 확실하게 알 수 있습니다.

D:\Sources>perl -w -x "%ProgramFiles(x86)%\srcsrv\ssindex.cmd" /debug -SYSTEM=TFS -SYMBOLS="d:\sources\bin\release" -SOURCE=d:\sources
--------------------------------------------------------------------------------

ssindex.cmd [STATUS] : Server ini file: C:\Program Files (x86)\Debugging Tools for Windows (x86)\srcsrv\srcsrv.ini
ssindex.cmd [STATUS] : Source root    : D:\Sources\
ssindex.cmd [STATUS] : Symbols root   : D:\Sources\\bin\Release
ssindex.cmd [STATUS] : Control system : TFS
ssindex.cmd [STATUS] : TFS program name: tf.exe
ssindex.cmd [STATUS] : TFS Label      : <N/A>
ssindex.cmd [STATUS] : Old path root  : <N/A>
ssindex.cmd [STATUS] : New path root  : <N/A>
--------------------------------------------------------------------------------

ssindex.cmd [STATUS] : Running... this will take some time...
ssindex.cmd [INFO  ] : ... wrote C:\Users\TestUser\AppData\Local\Temp\index195FB.stream to D:\Sources\TestProgram.pdb ...
...[생략]...
ssindex.cmd [INFO  ] : ... wrote C:\Users\TestUser\AppData\Local\Temp\index3059.stream to D:\Sources\bin\Release\TestLib.pdb ...




ssindex.cmd에 인자를 전달하는 경우 주의해야 할 사항이 하나 있습니다. -SYMBOLS 인자는 문제가 없는데, -SOURCE 인자에는 큰따옴표(")로 둘러싸면 안됩니다. 예를 들어 다음과 같이 지정하면,

perl -w -x "%ProgramFiles(x86)%\Debugging Tools for Windows (x86)\srcsrv\ssindex.cmd" -SYSTEM=TFS -SYMBOLS="d:\sources\bin\release" -SOURCE="d:\sources"

ssindex.cmd 내부의 -SOURCE 구문 해석에 오류가 있어서 다음과 같이 마지막의 큰따옴표(") 문자를 경로에 포함하게 됩니다.

D:\Sources>perl -w -x "%ProgramFiles(x86)%\Debugging Tools for Windows (x86)\srcsrv\ssindex.cmd" /debug -SYSTEM=TFS -SYMBOLS=d:\sources\bin\release -SOURCE="d:\sources"
--------------------------------------------------------------------------------

ssindex.cmd [STATUS] : Server ini file: C:\Program Files (x86)\Debugging Tools for Windows (x86)\srcsrv\srcsrv.ini
ssindex.cmd [STATUS] : Source root    : D:\Sources"
ssindex.cmd [STATUS] : Symbols root   : D:\Sources\\bin\Release
ssindex.cmd [STATUS] : Control system : TFS
ssindex.cmd [STATUS] : TFS program name: tf.exe
ssindex.cmd [STATUS] : TFS Label      : 
ssindex.cmd [STATUS] : Old path root  : 
ssindex.cmd [STATUS] : New path root  : 
--------------------------------------------------------------------------------

ssindex.cmd [STATUS] : Running... this will take some time...
ssindex.cmd [INFO  ] : ... indexing D:\Sources\bin\Release\TestProgram.pdb
ssindex.cmd [INFO  ] : ... zero source files found ...
...[생략]...
ssindex.cmd [INFO  ] : ... indexing D:\Sources\bin\Release\TestLib.pdb
ssindex.cmd [INFO  ] : ... zero source files found ...

결과적으로 "zero source files found" 문제를 발생하게 됩니다.




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]







[최초 등록일: ]
[최종 수정일: 7/17/2021]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




1  2  3  4  5  [6]  7  8  9  10  11  12  13  14  15  ...
NoWriterDateCnt.TitleFile(s)
13484정성태12/14/20232175개발 환경 구성: 694. Windows 디렉터리 경로를 WSL의 /mnt 포맷으로 구하는 방법
13483정성태12/14/20232317닷넷: 2184. C# - 하나의 resource 파일을 여러 프로그램에서 (AOT 시에도) 사용하는 방법파일 다운로드1
13482정성태12/13/20232914닷넷: 2183. C# - eFriend Expert OCX 예제를 .NET Core/5+ Console App에서 사용하는 방법 [2]파일 다운로드1
13481정성태12/13/20232287개발 환경 구성: 693. msbuild - .NET Core/5+ 프로젝트에서 resgen을 이용한 리소스 파일 생성 방법파일 다운로드1
13480정성태12/12/20232663개발 환경 구성: 692. Windows WSL 2 + Chrome 웹 브라우저 설치
13479정성태12/11/20232345개발 환경 구성: 691. WSL 2 (Ubuntu) + nginx 환경 설정
13477정성태12/8/20232535닷넷: 2182. C# - .NET 7부터 추가된 Int128, UInt128 [1]파일 다운로드1
13476정성태12/8/20232272닷넷: 2181. C# - .NET 8 JsonStringEnumConverter의 AOT를 위한 개선파일 다운로드1
13475정성태12/7/20232338닷넷: 2180. .NET 8 - 함수 포인터에 대한 Reflection 정보 조회파일 다운로드1
13474정성태12/6/20232183개발 환경 구성: 690. 닷넷 코어/5+ 버전의 ilasm/ildasm 실행 파일 구하는 방법 - 두 번째 이야기
13473정성태12/5/20232394닷넷: 2179. C# - 값 형식(Blittable)을 메모리 복사를 이용해 바이트 배열로 직렬화/역직렬화파일 다운로드1
13472정성태12/4/20232215C/C++: 164. Visual C++ - InterlockedCompareExchange128 사용 방법
13471정성태12/4/20232293Copilot - To enable GitHub Copilot, authorize this extension using GitHub's device flow
13470정성태12/2/20232592닷넷: 2178. C# - .NET 8부터 COM Interop에 대한 자동 소스 코드 생성 도입파일 다운로드1
13469정성태12/1/20232315닷넷: 2177. C# - (Interop DLL 없이) CoClass를 이용한 COM 개체 생성 방법파일 다운로드1
13468정성태12/1/20232253닷넷: 2176. C# - .NET Core/5+부터 달라진 RCW(Runtime Callable Wrapper) 대응 방식파일 다운로드1
13467정성태11/30/20232352오류 유형: 882. C# - Unhandled exception. System.Runtime.InteropServices.COMException (0x800080A5)파일 다운로드1
13466정성태11/29/20232520닷넷: 2175. C# - DllImport 메서드의 AOT 지원을 위한 LibraryImport 옵션
13465정성태11/28/20232291개발 환경 구성: 689. MSBuild - CopyToOutputDirectory가 "dotnet publish" 시에는 적용되지 않는 문제파일 다운로드1
13464정성태11/28/20232419닷넷: 2174. C# - .NET 7부터 UnmanagedCallersOnly 함수 export 기능을 AOT 빌드에 통합파일 다운로드1
13463정성태11/27/20232377오류 유형: 881. Visual Studio - NU1605: Warning As Error: Detected package downgrade
13462정성태11/27/20232392오류 유형: 880. Visual Studio - error CS0246: The type or namespace name '...' could not be found
13461정성태11/26/20232413닷넷: 2173. .NET Core 3/5+ 기반의 COM Server를 registry 등록 없이 사용하는 방법파일 다운로드1
13460정성태11/26/20232363닷넷: 2172. .NET 6+ 기반의 COM Server 내에 Type Library를 내장하는 방법파일 다운로드1
13459정성태11/26/20232330닷넷: 2171. .NET Core 3/5+ 기반의 COM Server를 기존의 regasm처럼 등록하는 방법파일 다운로드1
13458정성태11/26/20232353닷넷: 2170. .NET Core/5+ 기반의 COM Server를 tlb 파일을 생성하는 방법(tlbexp)
1  2  3  4  5  [6]  7  8  9  10  11  12  13  14  15  ...