자신의 심볼을 이용하기 : 소스서버를 이용한 소스인덱싱 개발도구

오랜만에 글을 올리네요.
지난번에 디버깅 심볼을 알아보고 심볼을 심볼서버에 올리는 방법까지 알아봤습니다.
안보신분이 계시다면 아래 링크로 이동하셔도 됩니다.

사용관점에서 볼때, 지난 포스팅에서는 단순히 심볼을 저장하는데까지만 다뤘습니다.
이제 어떻게 자신의 심볼을 활용하는지 써보려 합니다.

일단 단순히 자기 자신의 심볼을 툴을 이용해서 자동으로 땡겨오려면 _NT_SYMBOL_PATH 경로를 지정해주시면 됩니다.

SRV*E:\OSSymbols*http://msdl.microsoft.com/download/symbols;E:\ProductSymbols

위의 값을 _NT_SYMBOL_PATH에 등록하면 OS심볼을 찾고 없으면 E:\ProductSymbols에서 찾게 됩니다.
E:\ProductSymbols는 자신의 PC에서만 사용하지말고 별도의 서버로 사용하는게 좋습니다.
중요한 것은 팀이 같이 공유를 해야 큰 의미가 있습니다. 

간단하게 자신의 심볼을 이용하는걸 알아봤는데요.
이렇게만 사용하는 것은 제가 봤을때 완벽하지 않습니다.
왜냐면 소스코드 레벨의 사후 디버깅이 안되거든요.
덤프파일을 받았고 디버깅심볼이 있다고 가정해볼께요.
그리고 WinDbg나 Visual Studio로 덤프를 열였다면.. 
콜스택이 나올 것이고 그리고 콜스택에 포함된 함수이름도 잘 나올겁니다.
그런데 그 당시의 소스코드가  없다면 디스어셈블러로 보셔야 할 겁니다.
디스어셈블러로 보시는걸 좋아하신다면 말리지는 않겠지만, 그래도 소스코드가 편하시지 않겠어요??!!

덤프파일만 WinDbg에서 열면 바로 소스코드를 볼수 있는 방법이 있습니다.
그런데 심볼에서 소스가 덜컥 나오진 않겠죠??
그럼 덤프를 열때 그 덤프에 해당하는 소스는 어디서 생겨나는 걸까요?
바로 Subversion과 같은 소스관리도구입니다. 
이 기능은 소스관리도구자체적으로 지원하는 것은 아니고 WinDbg의 소스서버란 놈이 해줍니다..
WinDbg를 설치하고 설치된 경로에 srcsvr 이란 폴더가 있을겁니다.
(저는 여기에 설치되어 있네요. : C:\Program Files\Debugging Tools for Windows \srcsrv  )

지원가능한 소스관리도구는 CVS, Subversion, Visual SourceSafe, Team Foundation Server 인것으로 보입니다.
더 있는지도 모르겠군요. 저는 Subversion만을 사용해봤기 때문에 Subversion으로 설명을 드리겠습니다.

우선 Srcsvr를 사용하려면 Perl이 설치되어 있어야 합니다. 
소스서버스크립트가 Perl로 되어있거든요.
윈도우에 설치해야하니깐 일반적으로 ActivePerl로 해야겠죠?
그리고 Perl이 설치된 경로를 환경변수 "Path" 에 등록시켜주세요.

이제 드디어 소스인덱싱할 시간이 되었습니다. ^^
프로젝트를 최종적으로 빌드하고 심볼을 심볼서버에 올리기전에 아래처럼 소스인덱싱을 합니다.

 svnindex.cmd /source=E:\Project\ProductA_Src /symbols=E:\Project\
ProductA_Src\Release /debug

오류없이 정상적으로 처리되었다면 어떤 소스가 인덱싱되었는지 쫙~ 나올겁니다. 
(흠.. 나중에 캡쳐해서 글을 업데이트해야 겠네요 ^^)

그런데 프로젝트폴더가 여러 개라면 재귀적으로 심볼경로와 소스경로를 해당 소스트리의 Root로 지정해주시면 되요.
예를들어, E:\Product\ProductA_DLL,   E:\Product\ProductB_DLL 있다면 이것들을 한번에 인덱싱할 수 있다는 거죠.

svnindex.cmd /source=E:\Project /symbols=E:\Project /debug

위 처럼하면 재귀적으로
처리가
처리가 될 겁니다.

이제 symstore.exe로 심볼을 서버에 올리시면 됩니다

symstore.exe add /r /f .\*.* /s \\devsvr\ProductsSymbols/t "
제품이름
제품이름" /v "Build 201X.XX.XX" /c "Comment"


이제 소스가 인덱싱된 심볼이 등록되었으니 사후디버깅쯤은 거뜬하겠군요! ㅋㅋ(이 정도 해놓으면 참 뿌듯합니다^^)
그리고 참고로 심볼에 소스코드자체가 들어가는걸로 오해하는 분이 계실까봐 말씀드리지만,
심볼에는 Subversion의 리비전정보, url 경로같은게 포함되게 되는 겁니다.
나중에 덤프파일로 디버깅할때 소스를 Subversion에서 받아오게 되는 겁니다.
이 정도로 구축해 놓으면 심볼관리하기가 정말 편해집니다.
심볼을 많이 활용하는 디바이스드라이버을 개발할때 쓰편 참 편합니다.

그걸로 끝이 아닙니다.
이 명령어들을 손수 타입해주거나 .bat로 만들어서 실행시켜주는거는 꽤 번거롭습니다.
그런걸 한방에 끝낼 수는 없을까요?
자동화빌드란거 혹시 들어보셨나요?? 
이걸 이용하시면 빌드, 심볼인덱싱, 심볼서버에 심볼등록, 바이너리파일을 배포서버나 FTP에 등록할 수도 있습니다.
활용할만한게 꽤 많죠.
다음 포스팅때는 자동화빌드도구를 이용해서 위와 같은 작업을 어떻게 하는지 올려보겠습니다.


참고자료: 윈도우 프로젝트 필수 유틸리티, Debugging Application 2th, 삽질


핑백

  • 책 이야기 : 소스 서버 설정 2013-01-08 13:53:08 #

    ... pdb 파일 분석하다가 여기까지 와버렸다. 일단 메모해두고 나중에 정리하자. http://nyolong.egloos.com/1370997http://www.devpia.com/Maeul/Contents/Detail.aspx?BoardID=51&MAEULNO=20& ... more

덧글

  • 지나가던이 2011/01/29 19:49 # 삭제 답글

    windbg 에서는 소스 코드가 pdb 를 만들때와 다르더라도 어셈블리가 아니라 코드를 찍어 줍니다.
    다만 해당 코드의 소스가 변경 된 후기 때문에 예전 버전과 다른 곳을 찍을 뿐입니다.
  • 지나가다 2011/04/12 17:56 # 삭제 답글

    쓰신글 차례 차례 읽으면서 많은 도움이 되었습니다~~~ 너무 감사해요~~
  • 뇨릉 2011/04/14 10:53 #

    도움이되었다니 기쁘네요 ^^; 고맙습니다.
  • 붕어 2012/02/03 11:13 # 삭제 답글

    안녕하세요 소스서버랑 심볼서버 구성중에 의문이 있어 질문 드립니다
    작동순서가 이렇게 되는건가요?
    1.덤프파일은 얻는다.
    2.덤프파일을 vs로 실행하면 환경변수에 등록된 경로에서 PDB를 다운 받는다.
    3.PDB에 심어진 소스버전 정보를 이용하여 svn에서 소스를 다운 받는다.

    디버깅 환경을 구성중인데 잘 안되네용 ^^;
  • 뇨릉 2012/02/03 14:09 #

    서버구성중에는 덤프파일과 관련이 없는 부분은데요. 잘 이해가 안되네요.. ^^;;
    말씀하신 순서는 덤프파일을 갖고 디버깅할때의 순서입니다.
    2번과 3번은 WinDBG, VisualStudio를 통해 덤프를 분석할때 툴이 알아서 해주는 부분입니다.

    심볼서버와 소스서버구축이 완료되었는데 덤프파일을 통해 디버깅시 소스레벨의 디버깅이 안된다는 말씀이신것같은데요. 맞나요?? 그렇다면 _NT_SYMBOL_PATH 에서 Private 심볼을 못갖고 오는 것이거나 소스인덱싱에 문제가 있을 것 같습니다.
댓글 입력 영역