05/01/2014

Jeszcze więcej szczegółów na temat IntelliTrace

Home

O IntelliTrace pisałem już wielokrotnie. Do tej pory nie wyjaśniłem jednak, że chociaż IntelliTrace nazywamy debugger'em historycznym to w rzeczywistości IntelliTrace jest profilerem. Dokładniej mówiąc jednym z komponentów składowych IntellITrace jest niezarządzana implementacja interfejsu ICorProfiler. Profiler ten komunikuje się z zarządzaną częścią IntelliTrace, czyli z programem IntellITrace.exe. IntellITrace.exe jest natomiast używane przez Visual Studio.

Ma to ciekawe skutki. Oznacza bowiem, że oprócz nagrywania działania aplikacji z poziomu Visual Studio albo bezpośrednio przy pomocy programu IntelliTrace.exe (jak to opisałem tutaj) dochodzi jeszcze jedna opcja. Otóż możemy skorzystać ze zmiennych środowiskowych COR_ENABLE_PROFILING oraz COR_PROFILER i monitorować przy pomocy IntelliTrace zarządzaną usługę systemową.

W tym celu znajdujemy w rejestrze klucz:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\<Nazwa_Usługi>

Dodajemy do niego nową wartość Environment o typie REG_MULTI_SZ i zawartości:
COR_PROFILER={b19f184a-cc62-4137-9a6f-af0f91730165}
COR_ENABLE_PROFILING=1
VSLOGGER_CPLAN=COLLECTION_PLAN_PATH
W pierwszeh linijce wskazujemy profiller, jaki ma zostać użyty do monitorowania usługi. W tym przypadku będzie to IntelliTrace dla VS 2012. Identyfikator profiler'a IntelliTrace dla VS 2010 jest inny tj. 301EC75B-AD5A-459C-A4C4-911C878FA196. Oczywiście, jeśli nie mamy zainstalowanej danej wersji Visual Studio, to profiler nie będzie zarejestrowany w systemie.

W drugiej linijce po prostu włączamy profilowanie, a w trzeciej wskazujemy ścieżkę to pliku XML z konfiguracją IntelliTrace. O tym, skąd wziąć ten plik, pisałem we wspomnianym już artykule oraz w innych postach z serii o IntelliTrace. Tutaj zaznaczę tylko, że należy w nim ustawić nazwę pliku z logiem oraz katalog roboczy np.:
<CollectionPlan xmlns="urn:schemas-microsoft-com:visualstudio:tracelog">
  <StartupInfo>
    <LogFileName>log.itrace</LogFileName>
    <LogFileDirectory>c:\Logs</LogFileDirectory>
    <MaximumLogFileSize>-1</MaximumLogFileSize>
  </StartupInfo>
  ...
</CollectionPlan>
Na koniec po prostu uruchamiamy naszą usługę, a kiedy wykona swoje zadanie zatrzymujemy i przeglądamy nagrany log na przykład w Visual Studio.

Niestety, ale to podejście nie zadziała dla zwykłych aplikacji uruchamianych z dwukliku. Sądzę, że w takich wypadkach IntelliTrace nie obsługuje zmiennej środowiskowej VSLOGGER_CPLAN, ale tego akurat nie jestem pewny. Istnieje jednak inna możliwość. W praktyce używana jest rzadko, gdyż jest mało wygodna, ale pokazuje jak IntelliTrace działa od środka. A więc uruchamiamy wiersz polecenia i wpisujemy następujące komendy:
rem Uruchamiamy instancję IntelliTrace o nazwie 'test' ale nie wskazujemy programu do monitorowania
%INTELLI_TRACE_PATH%\IntelliTrace.exe start /n:test /f:"D:\WorkingDir\IntelliTrace\IntelliTraceWorkingDir\Test.iTrace" /cp:%COLLECTION_PLAN%

rem Włączamy profilowanie
set COR_ENABLE_PROFILING=1

rem Ustawiamy profiler, który chcemy użyć do monitorowania naszego programu tj. IntelliTrace
set COR_PROFILER={b19f184a-cc62-4137-9a6f-af0f91730165}

rem Ustawiamy nazwę instancji IntelliTrace z jakiej chcemy skorzystać
set VSLOGGERNAME=test

rem Uruchamiamy program, który chcemy monitorować przy pomocy instancji IntelliTrace o nazwie 'test'
MyProgram.exe

rem Zamykamy instancję IntelliTrace o nazwie 'test'
%INTELLI_TRACE_PATH%\IntelliTrace.exe stop /n:test /cp:%COLLECTION_PLAN%
Podejście to różni się od standardowego tym, że tutaj instancja IntelliTrace czeka na uruchomienie programu, zamiast uruchomić go samemu.

23/12/2013

Życzenia świąteczne

Home



Święta Bożego Narodzenia już za progiem i wielu z Was zapewne jest już na zasłużonym urlopie. Zanim i ja się "wyłączę", chcę Wam życzyć wszystkiego dobrego, chwili wytchnienia i wypoczynku w gronie bliskich Wam osób oraz żeby te Święta były jeszcze lepsze niż przed rokiem. Na Nowy Rok życzę natomiast suckesów, ciekawych wyzwań oraz, po części również sobie, wielu ciekawych treści na blogu.

Michał Komorowski

Problem z Resharper 7.1 i VS 2012 Update 4

Home

Od czasu sławetnej promocji JetBrains jestem szczęśliwym posiadaczem Resharper'a 7.1 Nie będę pisał, że to bardzo dobre narzędzie bo o tym chyba już każdy wie. Niestety jakiś czas temu przestała mi działać opcja Run Unit Tests w Visual Studio 2012 tj. po jej wybraniu testy nie były poprostu uruchamiane. Problem zbiegł się z instalacją Visual Studio Update 4, a więc miałem podejrzenie, że w tym tkwi problem. Ostatnio natknąłem się na ten wątek i okazało się, że miałem rację. Szczęśliwie zainstalowanie najnowszej wersji Resharper'a 7.1 rozwiązało problem.

10/12/2013

"Sztuczka" dla pracujących z danymi hierarchicznymi

Home

Pracuję przy projekcie, którego ważnym elementem jest obsługa tzw. profili inwestycyjnych np.:

Fundusz A inwestuje 10% w Fundusz B i 30% w Fundusz C, a Fundusz C 100% w Fundusz D, który...

Pisząc zapytanie wyciągające takie hierarchiczne chcę szybko podejrzeć wynik w formie graficznej. W końcu jeden obraz wart więcej niż tysiąc rekordów zwróconych przez zapytanie. Kolega (dziękuję Łukasz) polecił mi stronkę GraphViz Workspace, która na życzenie generuje grafy/drzewa na podstawie opisu zgodnego z formatem obsługiwanym oczywiście przez Graphviz.

Ok, ale jak to wykorzystać aby łatwo i szybko wizualizować wynik zapytania? Oto prosty przykład. Zacznijmy od utworzenia tabeli z danymi hierarchicznymi.
CREATE TABLE dbo.Hierarchy
(
 Parent INT,
 Child INT
);

INSERT INTO dbo.Hierarchy(Parent, Child)
VALUES (1,2), (1,3), (1,4), (2,5), (2,6), (4,5), (5,7), (7,8), (6,8);
Następnie wyciągniemy z niej dane, bazując na tym, że w formacie GraphViz węzeł rodzic i węzeł dziecko połączone są strzalką ->:
SELECT CAST(Parent AS VARCHAR) + '->' + CAST(Child AS VARCHAR)
FROM dbo.Hierarchy
Wynik zapytanie wystarczy skopiować i umieścić na stronie GraphViz Workspace:

digraph g{TUTAJ}

Aby otrzymać taki wynik:



Prosto, łatwo i przyjemnie.

07/12/2013

Mała wskazówka jak pisać szybsze makra dla Excela

Home

Od dłuższego czasu do śledzenie rodzinnych wydatków używam programu Excel wraz z napisanym przez siebie makrem, które wylicza statystyki, sumuje wydatki według kategorii itp. Po przesiadce na nowy komputer makro zaczęło jednak działać wolniej. Wcześniej przeliczenie arkusza zajmowało chwilę, a teraz nawet kilka sekund. Dodatkowo w czasie działania makra arkusz migał. Ewidentnie wygląda to na problemy z szybkim odświeżaniem ekranu. Może spowodował to nowy system operacyjny, a może nowy sterownik karty graficznej?

Nie wiem jaka dokładnie była przyczyna ale rozwiązanie problemy było bardzo proste. Postanowiłem poszukać Excel'owego odpowiednika metod SuspendLayout/ResumeLayout znanych z technologii Windows Forms. Bardzo szybko znalazłem właściwość Application.ScreenUpdating, która pozwala włączyć/wyłączyć odświeżanie ekranu. Jej ustawienie na False w makrze przed rozpoczęciem obliczeń, a potem znowu na True rozwiązało mój problem w 100%.