2016-12-24 1 views
0

Um einen Hintergrund zu geben, möchte ich die Protokollnachrichten auf der Grundlage der Aufrufliste auf eine saubere Art und Weise drucken.Wie erhalte ich die Position der Funktion im Call-Stack?

Zum Beispiel.

Sollte geben die Ausgabe als

foo(){ 
    printf("Foo was called"); 
    bar(); 
} 

bar(){ 
    printf("bar was called"); 
    jai(); 
} 
jai(){ 
    printf("Jai was called"); 
} 

<<<OUTPUT>>> 
Foo was called. 
    bar was called 
     jai was called. 

Ich möchte nicht auf diese Funktion die Anzahl der Räume als Argument übergeben oder eine globale Zählung der gleichen halten.

Ich dachte, dass, wenn wir die Position der Funktion in dem Call-Stack erhalten können, dann können wir in der gleichen Anzahl von Leerzeichen vor dem Text füllen Sie das gewünschte Format der Ausgabe zu erhalten.

Ich sehe Backtrace Funktionsaufruf sieht vor, dass mit den ganzen Stapel Namen als auch zurückgegeben. Es gibt auch die Gesamtzahl der Funktionen in dem Aufruf zurück.

Gibt es Funktionen, die nur die Position zurückgeben?

+0

„_if können wir die Position der Funktion in dem Aufruf stack_ bekommen“: Das ist entweder eine Menge von Anweisungen auszuführen, oder einen Parameter oder eine globale Variable. –

Antwort

2

Es gibt auch die Gesamtzahl der Funktionen im Anruf zurück.
Gibt es irgendwelche Funktionen, die nur die Position zurückgeben?

Sie sind ein und dasselbe.

Wenn der Call-Stack ist:

main -> foo -> bar -> jai 

und Sie wollen wissen, dass jai 4 Ebenen tief ist, dann Gesamtzahl der Funktionen ist das Niveau der jai.

Wenn Sie main ignorieren und nur "Ihre" Funktionen zählen möchten, subtrahieren Sie 1 von der Gesamtzahl der Funktionen.

2

Ich würde vorschlagen, vorhandene Bibliotheken dafür zu verwenden.

Wenn alle (oder zumindest die meisten) Code mit Debug-Informationen * in ZWERG-Format (unter Linux) kompiliert wird, empfehle ich Ian Taylor libbacktrace (innen GCC verwendet, aber verwendbar unabhängig). Wenn DWARF-Debug-Informationen verfügbar sind, ist es sogar in der Lage, Informationen zum Quellort anzugeben ...

Sie können auch den GNU glibc backtrace functions verwenden.

Siehe auch die return address builtins von GCC.

* Hinweis: Sie können passieren beide -g und -O2 zum gcc oder g++ Compiler beide Debug-Informationen und Optimierung aktivieren.

Verwandte Themen