2014-04-17 7 views
6

Ich versuche, ein Werkzeug ähnlich wie TraceGL zu schaffen, sondern auch für C-Typen Sprachen:Verarbeitung gcov Datendateien für Zwecke verfolgt

enter image description here

Wie Sie sehen können, das Werkzeug über Code-Highlights fließt, dass wurden nicht in rot ausgeführt.

Zum Erstellen dieses Tools für Objective-C zum Beispiel weiß ich, dass gcov (und libprofile_rt in clang) Datendateien ausgeben, mit denen Sie bestimmen können, wie oft eine bestimmte Codezeile ausgeführt wurde. Könnten die gcov-Datendateien mir jedoch sagen, wann eine bestimmte Codezeile während der Ausführung eines Programms aufgetreten ist?

Zum Beispiel, wenn Zeile X während Code-Pfade A und B aufgerufen wird, würde ich in der Lage sein, aus dem GCOV, dass Code-Pfade A und B Zeile X genannt Linie X allein?

Antwort

0

Soweit ich weiß, sagt GCOV Instrumentierung Daten nur, dass ein Punkt im Code ausgeführt wurde (und vielleicht wie oft). Aber es gibt keine Beziehung zwischen den Codepunkten, die instrumentiert werden.

Es klingt wie, was Sie wollen, ist Pfade durch den Code zu bestimmen. Um dies zu tun, müssen Sie entweder eine statische Analyse des Codes (erfordert einen vollständigen C Parser, Namensauflösung, Flow-Analyzer), oder Sie müssen die dynamische Instrumentierung Punkte in der Reihenfolge der Ausführung zusammen.

Die erste erfordert, dass Sie Maschinen finden, die in der Lage sind, C in seiner ganzen Pracht zu verarbeiten; du willst das nicht selbst wiederholen. GCC, Clang, unser DMS Toolkit sind Auswahlmöglichkeiten. Ich weiß, dass der GCC und Clang ziemlich ernsthafte Analysen durchführen. Ich bin mir ziemlich sicher, dass Sie zumindest eine intraprozedurale Kontrollflussanalyse finden können; Ich weiß, dass DMS das kann. Sie müssten GCC und Clang anpassen, um diese Daten zu extrahieren. Sie müssten DMS konfigurieren, um diese Daten zu extrahieren. Die Konfiguration ist einfacher als die Anpassung, da es sich um eine Designeigenschaft und keine "benutzerdefinierte" Aktion handelt. YMMV.

Mithilfe der GCOV-Daten können Sie dann die Flüsse zwischen den GCOV-Datenpunkten ermitteln. Es ist mir nicht klar, dass dies alles andere als das, was Sie bereits mit der statischen Kontrollflussanalyse erhalten, mit sich bringt, es sei denn, Ihr Ziel besteht darin, Ausführungsspuren anzuzeigen.

Um dies dynamisch auszuführen, können Sie jeden Datensammlungspunkt im instrumentierten Code erzwingen, um festzustellen, dass es der zuletzt gefundene Punkt ist. bevor dies gemacht wurde, würde es den zuletzt aufgetretenen Punkt aufzeichnen. Dies würde tatsächlich eine Kette von Referenzen zwischen Punkten erzeugen, die mit dem Kontrollfluss übereinstimmen würden. Das hat aus Ihrer Sicht zwei Probleme, denke ich: a) Sie müssten GCOV oder ein anderes Werkzeug modifizieren, um diese andere Art von Instrumentierung einzufügen, b) Sie müssen sich sorgen, was und wie Sie "Vorgänger" wann aufzeichnen Ein Datensammelpunkt wird mehr als einmal getroffen.

0

gcov (oder lcov) ist eine Option. Es produziert die meisten Informationen, die Sie suchen, aber wie oft diese Dateien aktualisiert werden, hängt davon ab, wie oft __gcov_flush() aufgerufen wird. Es ist nicht wirklich beabsichtigt, in Echtzeit zu sein und enthält nicht alle Informationen, nach denen Sie suchen (insbesondere das "Wann"). Es gibt eine kurze Zusammenfassung des gcov Datenformats here und in der Header-Datei here. lcov Daten werden beschrieben here.

Für das, was Sie suchen DTrace sollte in der Lage sein, alle Informationen zur Verfügung zu stellen, die Sie benötigen, und in Echtzeit.Für Objective-C auf Apple-Plattformen gibt es dtrace Sonden für die Laufzeit, mit denen Sie so ziemlich alles verfolgen können. Es gibt eine Reihe von nützlichen Leitfäden und Beispielen, um mehr über dtrace zu erfahren und wie man Skripte schreibt. Brendan Gregg bietet einige wirklich gute Beispiele. Big Nerd Ranch hat eine series of articles darauf gemacht.