Zine.net online

Witaj na Zine.net online Zaloguj się | Rejestracja | Pomoc
w Szukaj

mgrzeg.net - Admin on Rails :)

Własny serwer symboli - źródła

Skoro pisałem już o:
- plikach symboli;
- serwerze symboli
to nadszedł najwyższy czas, aby zmierzyć się z plikami źródłowymi, domykając tym samym mini serię.

Informacja o pliku źródłowym, na podstawie którego został wygenerowany plik z symbolami to nie tylko ścieżki do plików źródłowych, o których pisałem we wcześniejszej notce. Najważniejsze dane zapisane są w strumieniu srcsrv w ramach pliku .pdb i stanowią dla debuggera wskazówkę jak znaleźć odpowiedni plik źródłowy. Pomocne przy wypełnianiu tej informacji będą narzędzia dostępne w ramach Debugging Tools for Windows, znajdujące się w katalogu srcsrv i pozwalającye na przeindeksowanie plików źródłowych, które umieszczone są w kilku (arbitralnie wybranych przez Microsoft) systemach kontroli wersji. Oparte o perl (trzeba samodzielnie doinstalować) oraz pdbstr.exe i srctool.exe (w zestawie), a także odpowiednie narzędzia do dostępu do systemu kontroli wersji (te również od nas, najlepiej w ścieżce systemowej) wpisują do plików .pdb informacje o powiązanych źródłach. Source Server daje nam bardzo szerokie możliwości dostępu do różnych systemów kontroli wersji (w standardzie są to SVN, SourceSafe, CVS, ClearCase oraz TFS, które można bez większych problemów samodzielnie rozszerzyć o inne), dodatkowo w wersji 2 mamy możliwość sięgania do odpowiednio przygotowanych źródeł po HTTP, bez użycia dodatkowych narzędzi klienckich dla odpowiedniego systemu kontroli wersji, co jest bardzo wygodne w sytuacji, gdy chcemy skorzystać z debuggowania ze źródłami 'gdzieś-tam-w-polu' ;).

Źródła na SVN po HTTP

Korzystam z svn, więc na jego przykładzie pokażę w jaki sposób przeindeksować nasze źródła oraz dodać odpowiednie informacje do pliku .pdb.
Po wstępnym podzieleniu plików symboli na pełne oraz przycięte (strip.bat z poprzedniego wpisu) możemy dodać informację o źródłach. Składają się z dwóch plików:

>dbh PDBTester.pdb src
C:\Path2Src\PDBTesterCode.cs
C:\Path2Src\PDBTesterMain.cs

Przed przeindeksowaniem pliku symboli lokalne kopie plików .cs, które zostały użyte do wygenerowania programu, zostały zapisane w repozytorium, więc możemy przejść do samego indeksowania, które wykonuję w ramach skryptu src.bat:

svnindex /symbols=C:\Dev\build\binpl\sym.pri /source=C:\Path2Src

svnindex przechodzi rekurencyjnie przez wszystkie katalogi wskazane przez parametr /symbols i modyfikuje znalezione pliki .pdb, dopisując do strumienia srcsrv:

C:\Dev\build>\dbgtools\srcsrv\pdbstr.exe -r -p:binpl\sym.pri\prod\exe\PDBTester.pdb -s:srcsrv
SRCSRV: ini ------------------------------------------------
VERSION=1
INDEXVERSION=2
VERCTRL=Subversion
DATETIME=Thu Aug 11 13:35:36 2011
SRCSRV: variables ------------------------------------------
SVN_EXTRACT_TARGET=%targ%\%fnbksl%(%var3%)\%var4%\%fnfile%(%var1%)
SVN_EXTRACT_CMD=cmd /c svn.exe cat "%var2%%var3%@%var4%" --non-interactive > "%svn_extract_target%"
SRCSRVTRG=%SVN_extract_target%
SRCSRVCMD=%SVN_extract_cmd%
SRCSRV: source files ---------------------------------------
c:\Path2Src\pdbtestercode.cs*http://svn.mordor.net:8090/*svn/michal/MiscTests/PDBTester/
PDBTesterCode.cs*175
c:\Path2Src\pdbtestermain.cs*http://svn.mordor.net:8090/*svn/michal/MiscTests/PDBTester/
PDBTesterMain.cs*180
SRCSRV: end ------------------------------------------------
C:\Dev\build>\dbgtools\srcsrv\pdbstr.exe -r -p:binpl\sym.pub\prod\exe\PDBTester.pdb -s:srcsrv
C:\Dev\build>

Jak widać, tylko pliki .pdb z podkatalogów katalogu sym.pri zostały zmodyfikowane, te z sym.pub - nie. Adres svn.mordor.net jest w ramach mojej wewnętrznej domeny dev, ale opis serwera svn nie należy do tej notki, więc nie będziemy się dalej nad tym rozwodzić - tym bardziej, że dane te pobrane są przez svnindex z cache'a ustawień lokalnej instalacji svn. Ważne jest to, że SVN dostępny jest po HTTP, więc możemy z niego skorzystać z dowolnego miejsca z dostępem do netu i zainstalowanym lokalnie klientem svn.
SVN_EXTRACT_CMD z powyższego zrzutu to po prostu polecenie, które musi być wykonane przez debugger, aby pobrać źródła z repozytorium.
Skrypt perlowy załadowany w ramach svnindex wyciąga odpowiednie informacje z plików .pdb, łączy je z odpowiednimi z cache'a svn i dopisuje do pliku .pdb przy pomocy pdbstr (tym razem z opcjami -w oraz -i), więc ci, którzy nie przepadają za perlem mogą odetchnąć - właściwie wszystko to można zrobić z użyciem innych narzędzi, np. w C#, VB, etc. i nie jest to koszmarnie trudne. Tym samym jest to też dobra informacja dla tych, którzy używają repozytoriów innych producentów - samodzielne przygotowanie odpowiedniego narzędzia nie powinno być zbyt pracochłonne i w sumie sprowadza się do wymyślenia jak ma wyglądać polecenie pobierające źródła oraz odpowiednie zakodowanie odpowiednich zmiennych (var1,...,var4) przekazanych do tego polecenia. Sekcja SRCSRV: source files zawiera rozdzielone znakiem '*' odpowiednie zmienne - dla każdego pliku źródlowego użytego do wygenerowania .pdb po jednej linii. W powyższym przypadku dla pliku PDBTesterCode.cs będą to:
var1 - c:\Path2Src\pdbtestercode.cs
var2 - http://svn.mordor.net:8090/
var3 - svn/michal/MiscTests/PDBTester/PDBTesterCode.cs
var4 - 175

Wszystkich zainteresowanych odsyłam do dokumentu srcsrv.doc z katalogu srcsrv instalacji Debugging Tools for Windows - jest tam dokładny opis wszystkich użytych zmiennych, wystarczający do samodzielnych zabaw.
Tak przygotowane pliki .pdb możemy wrzucić do serwera symboli i potem wykorzystać już standardowo w debuggerze. Jedyne, co powinniśmy wykonać w ramach WinDbg to:

0:000> .srcpath srv*
Source search path is: srv*

i gotowe :)

Źródła po HTTP

Tak jak napisałem już wyżej, możemy wystawić źródła żywcem po http, dzięki czemu nie musimy mieć zainstalowanych żadnych narzędzi klienckich do obsługi repozytorium - wszystkim zajmie się sam debugger. Aby móc skorzystać z tej możliwości, musimy:
- zmodyfikować strumień srcsrv;
- udostępnić pliki źródłowe po http (np. na IIS).

Zacznijmy od modyfikacji strumienia, a jako wejściowych użyjemy plików .pdb przygotowanych do obsługi źródeł po SVN, przed wrzuceniem do serwera symboli.
W pierwszym kroku wyciągamy źródła z svn, korzystając ze skryptu extract.bat:

walk c:\Dev\build\binpl\sym.pri\*.pdb srctool -x -d:c:\dev\src

przy czym walk i srctool znajdują się w katalogu srcsrv pakietu z narzędziami do debuggowania.
Następnie używamy skryptu http.bat, który modyfikuje strumień srcsrv w plikach .pdb:

walk c:\Dev\build\binpl\sym.pri*.pdb c:\dbgtools\srcsrv\cv2http.cmd HTTP_ALIAS http://symbols.mordor.net/sources

i w ten sposób mamy plik .pdb, który w strumieniu srcsrv zawiera:

C:\Dev\build>\dbgtools\srcsrv\pdbstr.exe -r -p:binpl\sym.pri\prod\exe\PDBTester.pdb -s:srcsrv
SRCSRV: ini ------------------------------------------------
VERSION=2
INDEXVERSION=2
VERCTRL=http
DATETIME=Thu Aug 11 15:54:48 2011
SRCSRV: variables ------------------------------------------
HTTP_ALIAS=http://symbols.mordor.net/sources
HTTP_EXTRACT_TARGET=%HTTP_ALIAS%/%var3%/%var4%/%fnfile%(%var1%)
SRCSRVTRG=%http_extract_target%
SRCSRVCMD=
SRCSRV: source files ---------------------------------------
c:\Path2Src\pdbtestercode.cs*http://svn.mordor.net:8090/*svn/michal/MiscTests/PDBTester/
PDBTesterCode.cs*175
c:\Path2Src\pdbtestermain.cs*http://svn.mordor.net:8090/*svn/michal/MiscTests/PDBTester/
PDBTesterMain.cs*180
SRCSRV: end ------------------------------------------------

Tu jedna, bardzo ważna uwaga - niestety oryginalny skrypt cv2http.pl z pakietu Debugging Tools (z katalogu srcsrv) powoduje, że HTTP_EXTRACT_TARGET wygląda nieco inaczej:

HTTP_EXTRACT_TARGET=%HTTP_ALIAS%/%var2%/%var3%/%var4%/%fnfile%(%var1%)

choć powinien:

HTTP_EXTRACT_TARGET=%HTTP_ALIAS%/%var3%/%var4%/%fnfile%(%var1%)

(po złożeniu ścieżki bez zmiany target zawierałby:
http://symbols.mordor.net/sources/http://svn.mordor.net:8090//svn/michal/MiscTests/PDBTester/PDBTesterCode.cs
co oczywiście nie ma sensu i dlatego należy w pliku cv2http.pl zmienić (różnica zaznaczona kolorami):

        s/^SRCSRVTRG=.*/$alias=$url\nHTTP_EXTRACT_TARGET=%$alias%\/%var2%\/%var3%\/%var4%\/%fnfile%(%var1%)\nSRCSRVTRG=%http_extract_target%/i;

na

    s/^SRCSRVTRG=.*/$alias=$url\nHTTP_EXTRACT_TARGET=%$alias%\/%var3%\/%var4%\/%fnfile%(%var1%)\nSRCSRVTRG=%http_extract_target%/i;

Po wykonaniu tych kroków możemy dodać pliki symboli do serwera symboli, a nasz katalog c:\Dev powinien wyglądać tak:

C:\Dev>tree c:\dev /F /A
C:\DEV
+---build
|   |   build.bat
|   |   extract.bat
|   |   http.bat
|   |   placefil.txt
|   |   src.bat
|   |   store.bat
|   |   strip.bat
|   |
|   +---binpl
|   |   +---prod
|   |   |       PDBTester.exe
|   |   |
|   |   +---sym.pri
|   |   |   \---prod
|   |   |       \---exe
|   |   |               PDBTester.pdb
|   |   |
|   |   \---sym.pub
|   |       \---prod
|   |           \---exe
|   |                   PDBTester.pdb
|   |
|   \---out
|       \---x86
|               PDBTester.exe
|               PDBTester.pdb
|
+---src
|   |   web.config
|   |
|   \---svn
|       \---michal
|           \---MiscTests
|               \---PDBTester
|                   +---PDBTesterCode.cs
|                   |   \---175
|                   |           pdbtestercode.cs
|                   |
|                   \---PDBTesterMain.cs
|                       \---180
|                               pdbtestermain.cs
|
\---symbols
    +---pri
    |   |   pingme.txt
    |   |   web.config
    |   |
    |   +---000Admin
    |   |       0000000001
    |   |       history.txt
    |   |       lastid.txt
    |   |       server.txt
    |   |
    |   +---PDBTester.exe
    |   |   \---4E3FEC738000
    |   |           PDBTester.exe
    |   |           refs.ptr
    |   |
    |   \---PDBTester.pdb
    |       \---D02C9D4C361D49FABEDFB65B7DA5635A1
    |               PDBTester.pdb
    |               refs.ptr
    |
    \---pub
        |   pingme.txt
        |
        +---000Admin
        |       0000000001
        |       history.txt
        |       lastid.txt
        |       server.txt
        |
        +---PDBTester.exe
        |   \---4E3FEC738000
        |           PDBTester.exe
        |           refs.ptr
        |
        \---PDBTester.pdb
            \---D02C9D4C361D49FABEDFB65B7DA5635A1
                    PDBTester.pdb
                    refs.ptr

Pozostaje nam udostępnienie katalogu c:\dev\src po HTTP, przy czym musimy zezwolić na przeglądanie katalogu oraz pobieranie plików .cs jako text/plain, co sprowadza się do pliku web.config:

---c:\dev\src\web.config---
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <directoryBrowse enabled="true" />
        <staticContent>
            <mimeMap fileExtension=".cs" mimeType="text/plain" />
        </staticContent>
        <security>
            <requestFiltering>
                <fileExtensions>
                    <remove fileExtension=".cs" />
                </fileExtensions>
            </requestFiltering>
        </security>
    </system.webServer>
</configuration>

Podobnie jak w przypadku SVN po HTTP, tu również wystarczy w debuggerze

0:000> .srcpath srv*
Source search path is: srv*

i do boju!

Ustawianie serwera symboli oraz serwera źródeł mamy zakończone. Teraz pozostaje nam cieszyć się z rozwiązania i w przypadku problemów sięgać do nich. Miłej zabawy! :)

Opublikowane 12 sierpnia 2011 00:54 przez mgrzeg

Powiadamianie o komentarzach

Jeżeli chciałbyś otrzymywać email gdy ta wypowiedź zostanie zaktualizowana, to zarejestruj się tutaj

Subskrybuj komentarze za pomocą RSS

Komentarze:

 

dotnetomaniak.pl said:

Dziękujemy za publikację - Trackback z dotnetomaniak.pl

sierpnia 12, 2011 06:24

Co o tym myślisz?

(wymagane) 
(opcjonalne)
(wymagane) 

  
Wprowadź kod: (wymagane)
Wyślij

Subskrypcje

W oparciu o Community Server (Personal Edition), Telligent Systems