Do tej pory poznałeś/aś cały kod odpowiedzialny za inicjalizację narzędzia Pintool i wstawianie wymaganej instrumentacji w postaci wywołań zwrotnych do procedur analizy. Jedyny kod, którego jeszcze nie widziałeś/aś, to faktyczne procedury analizy, które zliczają i rejestrują statystyki podczas działania aplikacji. Listing przedstawia wszystkie procedury analizy używane przez profilera.
Listing : profiler.cpp (ciąg dalszy)

Jak widać, procedury analizy są proste i implementują jedynie minimalny kod do śledzenia wymaganych statystyk. Jest to ważne, ponieważ procedury analizy są często wywoływane podczas działania aplikacji, co ma duży wpływ na wydajność narzędzia Pintool. Pierwsza procedura analizy, count_bb_insns (1), jest wywoływana podczas wykonywania bloku podstawowego i po prostu zwiększa wartość insn_count o liczbę instrukcji w bloku podstawowym. Podobnie, count_cflow (2) zwiększa wartość cflow_count podczas wykonywania instrukcji przepływu sterowania. Dodatkowo rejestruje adres źródłowy i docelowy gałęzi na mapie cflows oraz zwiększa licznik dla tej konkretnej kombinacji adresu źródłowego i docelowego. W Pin do przechowywania adresów używany jest typ całkowity ADDRINT (3). Procedura analizy, która rejestruje informacje o wywołaniu, count_call (4), jest analogiczna do count_cflow. Ostatnia funkcja na listingu 9-5, log_syscall (5), nie jest zwykłą procedurą analizy, lecz wywołaniem zwrotnym dla zdarzeń wejścia wywołania systemowego. W Pin procedury obsługi wywołań systemowych przyjmują cztery argumenty: THREADID identyfikujący wątek, który wykonał wywołanie systemowe; CONTEXT* zawierający takie dane, jak numer wywołania systemowego, argumenty i wartość zwracaną (tylko dla procedur obsługi wyjścia wywołania systemowego); argument SYSCALL_STANDARD identyfikujący konwencję wywołania wywołania systemowego; oraz wreszcie znany już void*, który pozwala na przekazanie zdefiniowanej przez użytkownika struktury danych. Przypomnijmy, że celem log_syscall jest rejestrowanie częstotliwości wywołań każdego wywołania systemowego. W tym celu wywołuje PIN_GetSyscallNumber, aby uzyskać numer bieżącego wywołania systemowego (6) i rejestruje trafienie dla tego wywołania systemowego na mapie wywołań systemowych. Teraz, gdy poznałeś już cały ważny kod profilera, przetestujmy go!



