2010-08-30 23 views
6

Ich habe die folgende Frage und aus einer Systemperspektive wollen wissen, wie dies einfach und effizient zu erreichen.C/C++ Frage zu Trace-Programmierung Techniken

Angesichts einer Aufgabe 'abc', die mit Debug-Informationen und eine globale Variable "TRACE", die normalerweise auf 0 gesetzt ist, würde ich in der Datei "Log" die Adresse jeder Funktion, die aufgerufen wird zwischen dem Zeitpunkt, dass TRACE auf 1 und wieder auf 0 gesetzt ist.

Ich erwog dies durch eine Frontloading/Boot-Strapping-Aufgabe, die ich entwickeln würde, die die Anweisungen für ein gemeinsames Sprungmuster sieht/frame pointer push, notieren Sie die Adresse und ordnen Sie Adressen den Funktionsnamen aus den symbolischen Debug-Informationen in abc zu. Es könnte jedoch bessere System-Level-Möglichkeiten geben, dies ohne einen Frontlader zu tun, und ich bin nicht sicher, was am machbarsten ist.

Irgendwelche implementierten Techniken da draußen?

+3

Profilometer kann bereits das für Sie tun - auch anstelle der Adresse den Namen der Funktion zeigt. Warum arbeiten sie nicht für dich? – Dummy00001

+0

Warum interessiert Sie die Adresse der Funktion statt ihres Namens? Außerdem ist es nützlich zu wissen, welches Betriebssystem und welcher Compiler Sie verwenden. –

+0

Ich verwende gcc/CC/xlC auf HP/Sun/IBM. Ich bin letztlich am Namen der Funktionen interessiert; Die Adresse war nur als Zwischenprodukt gedacht und könnte unnötig sein. Vielen Dank. – BlueCollar

Antwort

1

Stellen Sie sicher, dass Sie sich die vordefinierten IDs __func__ oder __FUNCTION__ angesehen haben. Sie stellen ein Zeichenfolgenliteral für den Namen der Funktion/Methode bereit, den Sie gerade ausführen.

3

Eine Möglichkeit besteht darin, die Quelle vor dem Kompilieren vorzuverarbeiten. Diese Vorverarbeitung würde Code am Anfang jeder Funktion hinzufügen, die die TRACE global überprüfen und, falls gesetzt, in das Protokoll schreiben würde. Wie Mystagogue sagte, verfügt der Compiler über Präprozessor-Makros, die auf den Namen der Funktion erweitert werden.

Sie können sich auch einige Profiling-Tools ansehen. Einige von ihnen haben Funktionalität, die Ihren Anforderungen entspricht. Zum Beispiel werden einige den gesamten Callstack in regelmäßigen Abständen abfragen, was Ihnen viel über den Codefluss erzählen kann, ohne jeden Anruf tatsächlich zu protokollieren.

+0

Vorverarbeitungsquellen können eine der günstigsten Möglichkeiten sein. – Dummy00001

+0

Wir müssen jeden Anruf protokollieren. Ich könnte dtrace verwenden, um periodische Hochfrequenz-Stapel zu bekommen, aber das wird nicht den Trick machen.Preprocessing Quellen können, aber unsere Binaries erreichen bereits die 32-Bit 4-Gig-Grenze. Danke – BlueCollar

2

Die Suche nach einem gemeinsamen Prolog/Epilog funktioniert nicht in der Abwesenheit von Frame-Pointer-Auslassung und Tail-Call-Optimierung. Moderne Optimierer teilen gerne Funktionen in mehrere Teile auf und verschmelzen gemeinsame Tail Chunks mit verschiedenen Funktionen.

Es gibt keine Standardlösung.

Für Microsoft Compiler, überprüfen Sie _penter und _pexit Haken. Für GCC, siehe -finstrument-functions Option und Freunde.

Auch auf x86 Windows können Sie einen Monitor wie WinApiOverride32 verwenden. Es ist in erster Linie für die Überwachung von DLL- und System-API-Aufrufen gedacht, Sie können jedoch eine Beschreibungsdatei aus der Map-Datei Ihrer Anwendung generieren und auch interne Funktionen überwachen.

(. Edited: hinzugefügt Link zu GCC Option)

+0

Ich stimme zu - Danke für die Rückmeldung. Der Debugger 'dbx' scheint das zu können, aber ich denke nicht, dass es eine Tail-Call-Optimierung gibt - oder wie könnte es dbx herausfinden? Wenn der Debugger es kann, sollten wir in der Lage sein. Das Problem ist, dass es offensichtlich nicht praktikabel ist, dies in einer Produktionsumgebung in dbx zu laden. Die Idee war also, die minimale Arbeit in einer ähnlichen Frontloading-Aufgabe zu erledigen, die sagen kann, wann die Binärdateien nach Funktionen rufen. Selbst im schlimmsten Fall konnte ich alle Sprünge aufzeichnen, was auch einen (wenn auch lauten) Intra-Funktions-Flow anzeigen würde. – BlueCollar

+0

Ich hoffe auf die -Finster-Funktionen :) werde weiter nachforschen .. vielen Dank – BlueCollar