Instrumentacja polega na dodawaniu do kodu instrukcji służących do uzyskania informacji o wydajności aplikacji
Instrumentacja pozwala na:
Lecz nic nie jest za darmo…
gcc -pg
dla gprof, QuantifyŹródło: wikipedia.org
gcc -pg source_files
mcount()
umieszczana przed każdym wywołaniem funkcjigcc -pg program.c -o program
gmon.out
grpof program gmon.out
gprof2dot
pozwala wizualizować graf wywołańvoid func2(void)
{
int i = 0;
for(;i<0xffffff;i++);
return;
}
void func1(void)
{
int i = 0;
for(;i<0xfffffff;i++);
func2();
return;
}
int main(void)
{
int i = 0;
for(;i<0xfffffff;i++);
func1();
for(i=0 ; i< 3 ; i++) func2();
return 0;
}
gprof a.out gmon.out
Flat profile: Each sample counts as 0.01 seconds. % cumulative self self total time seconds seconds calls ms/call ms/call name 44.92 0.80 0.80 1 799.52 850.12 func1 44.92 1.60 0.80 main 11.37 1.80 0.20 4 50.60 50.60 func2
granularity: each sample hit covers 2 byte(s) for 0.56% of 1.80 seconds index % time self children called name <spontaneous> [1] 100.0 0.80 1.00 main [1] 0.80 0.05 1/1 func1 [2] 0.15 0.00 3/4 func2 [3] ----------------------------------------------- 0.80 0.05 1/1 main [1] [2] 47.2 0.80 0.05 1 func1 [2] 0.05 0.00 1/4 func2 [3] ----------------------------------------------- 0.05 0.00 1/4 func1 [2] 0.15 0.00 3/4 main [1] [3] 11.2 0.20 0.00 4 func2 [3] -----------------------------------------------
Inny przykład (program make): overall-profile.txt sample.png
valgrind [opcje valgrind] program [opcje programu]
Przykład:
valgrind --tool=memcheck ls -l
Nie wymaga dostępu do źródeł programu ale kompilacja z symbolami debbugowania pozwala powiązać wynik z kodem:
gcc -g kod_programu
#include <stdlib.h>
void f(void)
{
int* x = malloc(10 * sizeof(int));
x[10] = 0; // problem 1: heap block overrun
} // problem 2: memory leak -- x not freed
int main(void)
{
f();
return 0;
}
gcc -pg -g mem1.c valgrind --leak-check=yes a.out
==23065== Invalid write of size 4 ==23065== at 0x400670: f (mem1.c:8) ==23065== by 0x400685: main (mem1.c:13) ==23065== Address 0x51fd778 is 0 bytes after a block of size 40 alloc'd ==23065== at 0x4C2AB80: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==23065== by 0x400663: f (mem1.c:7) ==23065== by 0x400685: main (mem1.c:13) ==23065== ==23065== ==23065== HEAP SUMMARY: ==23065== in use at exit: 40 bytes in 1 blocks ==23065== total heap usage: 2 allocs, 1 frees, 1,780 bytes allocated ==23065== ==23065== 40 bytes in 1 blocks are definitely lost in loss record 1 of 1 ==23065== at 0x4C2AB80: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==23065== by 0x400663: f (mem1.c:7) ==23065== by 0x400685: main (mem1.c:13) ==23065==
==23065== LEAK SUMMARY: ==23065== definitely lost: 40 bytes in 1 blocks ==23065== indirectly lost: 0 bytes in 0 blocks ==23065== possibly lost: 0 bytes in 0 blocks ==23065== still reachable: 0 bytes in 0 blocks ==23065== suppressed: 0 bytes in 0 blocks
valgrind --toll=callgrind program kcachegrind
![]() | ![]() |
Perforamnce Explorer:
konfiguracja sesji,
uruchamianie testów,
porównywanie raportów
Inclusive
- łącznie dla całej funkcji, iExclusive
- po odjęciu funkcji wołanych z wnętrza analizowanej funkcji Error List
zawiera ostrzeżenia i wskazówki dotyczące efektywności aplikacjiŻródło: http://msdn.microsoft.com