Testowanie programów III: valgrind i time

Dziś opowiemy o dwóch przydatnych narzędziach podczas debugowania – valgrind i time.

valgrind

Narzędzia valgrind używamy, gdy nasz program nie kończy się poprawinie lub dostajemy RTE (Runtime Exception) na sprawdzaczce. Powiem nam ono, w której linijce wychodzimy poza tablicę, odwołujemy się do miejsca spoza przydzielonej pamięci, dzielimy przez zero itp. Przypuśćmy, że mamy taki kod:

Jeśli go skompilujemy i uruchomimy, program zakończy się z błędem „Segmentation fault”. Jak zlokalizować, w której linijce jest błąd?

Kompilujemy nasz program z flagą -g, doda ona do pliku binarnego informacje pomocne przy debugowaniu.

lub

Uruchamiamy program z narzędziem valgrind:

 (gdy chcemy wprowadzić dane wejściowe, uruchamiamy tak:   )

valgrind uruchomi nasz program wyświetlając wszystkie napotkane błędy:

Poniższe frazy świadczą o tym, że błąd tkwi w linijce 18 w pliku program.cpp.

Wychodzimy w niej poza przydzieloną pamięć:

I rzeczywiście, po chwili zastanowienia dochodzimy do wniosku, że powinna wyglądać ona tak:

/usr/bin/time

Za pomocą narzędzia /usr/bin/time możemy zmierzyć, ile czasu i pamięci zużywa nasz program na dowolnym teście. Robimy to tak:

UWAGA! Pamiętajmy, żeby wpisać   zamiast tylko   . Ta druga komenda mierzy tylko czas. Flaga  również jest bardzo ważna, bez niej output narzędzia będzie średnio czytelny.

Powinniśmy dostać coś takiego:

Z linijek:

możemy wywnioskować, że wykonanie programu zajęło 10.4 sekundy i program potrzebował ok. 10.5MB pamięci. Podane wartości (zwłaszcza dla pamięci) mogą nie być w 100% zgodne ze sprawdzarką, jednak stanowią dość dobre przybliżenie.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

*