2016-07-19 20 views
1

Ich versuche, die genaue Anzahl der Funktionsaufrufe zu einer meiner implementierten C-Funktion in meinem Code zu finden. Das Projekt enthält mehrere C-Dateien. Was ist die einfachste Lösung, um herauszufinden, wie oft eine Funktion während der Ausführung des Programms aufgerufen wird? Insbesondere interessiert mich, wie oft eine bestimmte Funktion eine andere Funktion aufruft. Zum Beispiel habe ich eine C-Datei wie:Zählen der Anzahl der Funktionsaufrufe in einer ausführbaren Datei

//file1.c 
int main(){ 
foo1(); 
return 0; 
} 

und andere C-Dateien wie:

//file2.c 
void foo1(){ 
    foo2(); 
    ... 
    foo2(); 
} 

und

//file3.c 
void foo2(){ 
    foo3(); 
    foo3(); 
    foo3(); 
} 

Jetzt habe ich meine letzte ausführbare a.out und wollen wissen, wie viele mal foo3() heißt innerhalb foo1(). BTW, ich kompiliere und laufe mein Projekt unter Linux.

+0

'foo3' aus anderen Funktionen aufgerufen? –

+0

Wenn Sie dies innerhalb von foo3 wissen möchten, können Sie eine statische Variable innerhalb von foo3 deklarieren, die foo3 bei jedem Aufruf erhöht (eine statische Variable, die innerhalb einer Funktion deklariert ist, wird automatisch auf Null initialisiert und behält ihren Wert von einem Aufruf zum nächsten) . Andernfalls, wenn Sie dies von irgendwo im Programm wissen müssen, deklarieren Sie eine globale Variable, die foo3 bei jedem Aufruf erhöht. –

+1

Müssen Sie das programmieren oder können Sie ein externes Tool dafür verwenden? –

Antwort

4

Sie können zwei globale Variablen verwenden (Put extern an den Stellen, die die Variable außerhalb der Datei zugreifen, erklären Sie sie):

int foo1_active = 0; 
int foo3_counter = 0; 

dann jedes Mal foo1 heißt Sie es erhöhen variabel und vor der Rückkehr Sie dekrementieren es:

void foo1() { 
    foo1_active++; 
    ... 
    foo1_active--; 
    return 
} 

wenn foo3 wird Sie, wenn foo1 aktiv genannt überprüfen und wenn es tut erhöhen Sie den Zähler:

void foo3() { 
    if foo1_active > 0 { 
     foo3_counter++; 
    } 
    ... 
} 
+0

Ich habe 'foo3_counter' als' static int' in meiner main.c-Datei definiert und benutze 'extern int foo3_counter' in meiner Datei3.c, aber ich bekomme immer undefinierten Verweis auf 'foo3_counter'' in meiner Datei3.c . – A23149577

+0

@ A23149577 entfernen Sie die 'statische' –

1

Sie haben ein Ubuntu-Flag, also nehme ich an, dass Sie gcc verwenden. Ich würde stark überlegen, -pg zu Ihrem CFLAGS hinzuzufügen und gprof auszuprobieren.

Werke Profilierung durch Ändern, wie jede Funktion in Ihrem Programm zusammengestellt ist so, dass, wenn es aufgerufen wird, wird bunkern es weg einige Informationen darüber, wo es aus aufgerufen wurde. Hieraus kann der Profiler herausfinden, welche Funktion er aufgerufen hat, und kann zählen, wie oft er aufgerufen wurde. Diese Änderung wird vom Compiler vorgenommen, wenn Ihr Programm mit der Option '-pg' kompiliert wird, was bewirkt, dass jede Funktion mcount (oder _mcount, oder __mcount, je nach Betriebssystem und Compiler) als eine seiner ersten Operationen aufruft .

0

Sie können Funktionsaufrufe mit einer statischen Variablen anstelle einer globalen Variablen zählen.

int inc(){ 
    static int counter = 1; 
    counter++; 
    return counter; 
} 
int main(){ 
    int i; 

    for (i = 0; i < 10; i++) 
     printf("%d\n", inc()); 

    return 0; 
}