Rufen Sie Baum für embedded software
Kennt jemand einige Werkzeuge, um erstellen Sie ein call-Baum für C-Anwendung, die ausgeführt wird, auf einem mikrocontroller (Cortex-M3)? Es könnte sein, erzeugt aus dem source-code (nicht ideal), den Objekt-code (bevorzugte Lösung) oder zur Laufzeit (akzeptabel). Ich habe gprof, aber es gibt noch eine Menge fehlt, um es zu erhalten zu arbeiten auf einem embedded-system.
Einen zusätzlichen bonus wäre, dass das tool auch gibt die maximale stack-Tiefe.
Update: Lösung ist vorzugsweise frei.
InformationsquelleAutor Ron | 2009-06-11
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einem guten Weg dies zu erreichen ist durch die Verwendung der
--callgraph
option, um die ARM-linker (armlink), die Teil der rvct (nicht frei).Weitere details - callgraph-Dokumentation.
Erkenne ich aus einem der Kommentare, dass Sie sich für eine gcc-basierte Lösung, die das ist nicht. Aber es kann immer noch nützlich sein.
Aus dem source-code, die Sie verwenden können, Doxygen und GraphViz, auch wenn Sie nicht bereits verwenden Doxygen dokumentieren Sie Ihren code. Es ist möglich, konfigurieren Sie es so, dass es alle Funktionen und Methoden, ob oder nicht Sie haben die Dokumentation Kommentare. Mit AT&T Graphviz installiert, Doxygen gehören call und Anrufer-Diagramme für die meisten Funktionen und Methoden.
Vom Objekt-code, ich habe nicht eine Antwort bereit. Ich könnte mir vorstellen, dass dieses hohe Ziel abhängig, da auch mit der debug-Informationen vorhanden, es wäre zu analysieren, den Objekt-code zu finden, Anrufe und andere stack-Benutzer. Im schlimmsten Fall wird dieser Ansatz scheint, wie es erfordern würde, um effektiv zu simulieren, ist das Ziel.
Zur Laufzeit auf der Ziel-hardware Ihrer Wahl gehen zu einem großen Teil davon abhängen, welche Art von embedded OS vorhanden ist, und wie es gelingt stacks für jeden thread.
Einem gemeinsamen Ansatz zu initialisieren jeder Stapel auf einen bekannten Wert, der scheint unwahrscheinlich, dass allgemein gespeichert in automatischen Variablen. Ein interrupt-handler oder ein thread kann dann untersuchen Sie den stack(s) und Messen einer ungefähren high-water-mark.
Sogar ohne vorfüllen der stack und später zu Fuß suchen nach Fußspuren, ein interrupt konnte nur Probe der aktuelle Wert des stack pointer (für jeden thread), und halten Sie eine Aufzeichnung seiner größten beobachteten Ausmaß. Das würde erfordern Speicherplatz für eine Kopie der einzelnen threads, SP, und der interrupt-handler würde nicht sehr viel Arbeit zu tun, um die Informationen zu erhalten. Es hätte Zugriff auf die gespeicherten Zustände aller aktiven threads, natürlich.
Ich weiß nicht, ein tool, das dies ausdrücklich.
Wenn Sie geschehen, werden unter Verwendung von µC/OS-II von Micrium Ihre als Betriebssystem, könnten Sie einen Blick auf Ihre µC/Probe-Produkt. Ich habe nicht verwendet es selbst, aber es behauptet, zu ermöglichen, einen angeschlossenen PC zu beobachten, Programm-und Betriebssystem Status-Informationen in Echtzeit. Ich wäre nicht überrascht, wenn es anpassbar ist, um ein weiteres Echtzeit-BETRIEBSSYSTEM, wenn nötig.
Call-Graphen aus dem source-code ist kein problem, wie oben erwähnt, der compiler oder doxygen generieren können, diese Informationen aus dem source-code. Die meisten modernen Compiler generieren kann erzeugen ein call-graph als Teil des Prozess kompilieren.
Sich auf einem früheren embedded-Projekte, die ich gefüllt, der stack mit einem Muster und lief eine Aufgabe. Überprüfen Sie, bis zu welchem Punkt der stack zerstört mein Muster. Reload-stack mit Muster und ausführen der nächsten Aufgabe. Dies macht den code sehr ssslloowww .... aber frei ist. Es ist nicht völlig zutreffend, da alle Daten, ist das timing der ganzen Zeit und der code verbringt viel Zeit in der Fehler-Handler.
Auf einigen Prozessoren können Sie eine trace-pod, so dass Sie überwachen können, code-Abdeckung und was nicht, wenn Ihr Prozessor muss mit voller Geschwindigkeit ausgeführt wird, um getestet und Sie können auch nicht zulassen, dass die instrumentierte code. Leider sind diese Arten von Werkzeugen sind sehr teuer. Blick auf Grüne Hügel Time machine, wenn Sie Geld haben. Das machen alle Arten von debugging einfacher.
Ich habe nicht verwendet diese, aber sind Sie sich bewusst:
calltree
cflow
Seit Sie analysieren den source code, die Sie nicht berechnen stack-Tiefe.
Hinweis, Doxygen tun können "call graphs" und "Anrufer-Graphen" aber ich glaube, dass diese pro-Funktion und zeigen nur den Baum bis zu einer bestimmten Anzahl von "hops" von jeder Funktion.
Stack-Tiefe und/oder rufen Sie Baum-generation kann unterstützt werden durch die compiler-tools. Zum Beispiel, für die Renesas micros es gibt ein Programm namens Rufen Sie Walker.
Meine calltree graph generator, umgesetzt in der bash, mit cscope und Punkt.
Können Diagramme generieren von upstream-Anrufer, downstream aufgerufenen Methoden -, und call-Assoziationen zwischen Funktionen. Sie können es bis zum anzeigen von Diagrammen in einer Anzahl von weisen, einschließlich xfig, .png-Viewer, und der dynamische Punkt visualiztion tool "zgrviewer".
http://toolchainguru.blogspot.com/2011/03/c-calltrees-in-bash-revisited.html
Check-out StackAnalyzer.
Nur ein Gedanke. Ist es möglich, führen Sie es in einer virtuellen Maschine (wie z.B. Valgrind) und nehmen Sie stack Proben ?
Eclipse mit CDT C/C++ - Indizierung und zeigen Ihnen einen call-Graphen. Soweit ich weiß, Sie brauchen nicht zu in der Lage sein zu bauen, in Eclipse, um die indexer zu arbeiten, so stellen Sie sicher, dass alle source-Dateien in das Projekt.
Funktioniert es ziemlich gut.
Visual Studio tun, ähnlich (aber nicht kostenlos). Ich benutze Visual Studio zu arbeiten, um auf den embedded-Projekten; mit einer makefile-Projekt, das ich tun kann, all die Arbeit, außer Debuggen in der VS-IDE.
Habe ich vorgeschlagen, dieses Konzept, das bereits in eine andere Diskussion über die embedded-Entwicklung, aber wenn Sie wirklich brauchen ein callgraph -, als auch als stack verwenden, info, und das alles für umsonst, würde ich persönlich überlegen, einen open-source-emulator zu simulieren, die ganze Sache, während die Instrumentierung den Objekt-code durch hinzufügen einer Handvoll Haken, um den emulator selbst auf diese Daten abrufen.
Ich bin nicht vertraut mit diesem bestimmten Ziel, aber es gibt eine ganze Reihe von open-source-ARM-Emulatoren zur Verfügung (freshmeat, sourceforge, google), und Sie sind wahrscheinlich hauptsächlich daran interessiert, opcodes Bezug auf call/ret, push/pop?
Beispielsweise überprüfen Sie heraus skyeye.
So, auch wenn Sie finden, dass es nicht einfach zu verlängern, einen compiler oder einen emulator, diese Informationen zu liefern, sollte es noch möglich sein, erstellen ein einfaches Skript, um zu schauen, für den entrypoint und alle Anrufe/rets, sowie opcodes Bezug auf stack-Nutzung.
Natürlich, die einzige zuverlässige Informationen über die stack-Nutzung kommen aus der Laufzeit-Messtechnik, vorzugsweise in der Ausübung der alle wichtigen code-Pfade.
Einem hübschen Licht-Werkzeug: Ägypten
Verwenden Verstehen: http://www.scitools.com/
Es ist nicht kostenlos, und läuft auf Quelle (nicht zur Laufzeit), aber es funktioniert, es funktioniert gut, und es ist gut unterstützt.
Wird es Ihnen sagen, viel mehr als jemals wollen, um zu wissen, über Ihre Codes.
Ich weiß, das ist reponding auf eine sehr alte Frage, aber könnte jemand stolpern, dies mit der gleichen Frage...
Ich vor kurzem experimentierte mit einem Python-Skript analysiert die assembler-version der Anwendung, extrahiert die stack-Nutzung und der Aufruf Baum, und gibt die maximale stack Verwendung. In meinem build-system, die ich dann verwenden, erstellen Sie einen Stapel von genau dieser Größe.
Habe ich es nur für kleine Anwendungen, aber es scheint zu funktionieren OK für AVR8, MSP430, und Cortex-M3. Offensichtlich gibt es strikte Einschränkungen: keine indirekten Aufrufe (ohne Funktion Zeiger, keine virtuellen Funktionen), keine Rekursion und der stack-assembler Instruktion Muster, die verwendet werden, sind auf das beschränkt, was ich gefunden in der GCC-Ausgabe. Falls diese Einschränkungen nicht erfüllt sind, wird das script einen Fehler melden.
Den Python-source ist 24k, kostenlos (boost-Lizenz), nicht sehr schnell, und noch in der Entwicklung. Kontaktieren Sie mich, wenn Sie interessiert sind.