Einarbeitung in fremde C++-Programme



  • Hi,

    nicht, dass ich wüsste.

    Also prinzipiell kannst Du natürlich erstmal vom main() aus die Aufrufpfade verfolgen, aber ich würde zusätzlich immer noch ein Klassendiagramm daneben legen, weil 60 Klassen schon ein wenig unübersichtlich werden (wenn ich persönlich das auch noch nicht als besonders großes Programm bezeichnen würde 😉 - für einen Anfänger aber schon eine Nummer).

    Insgesamt kann man nur auf sinnvolle Programmstruktur (Design, Namensgebung, Kapselung, Patterns, ...) hoffen. Wenn Dir ein "Kraut&Rübe-Programm" hinterlassen wurde, hilft Dir da kein Buch der Welt 😃

    Gruß,

    Simon2.



  • Danke für die Tipps. Ich bin jetzt noch optimist. Werde das Klassendiagramm auf jeden Fall erzeugen.
    Ich sage bescheid, wenn ich Literatur zum Thema finde.



  • 10000 zeilen in 60 klassen? viel spaß 👎





  • Sorry, das Buch scheint nicht gut zu sein. 🙄



  • debugger + singlestep ist dein freund 🙂
    es geht nichts über ne debugsession um die innerein eines progs zu verstehen.



  • Lass am besten erst einmal Doxygen über das Programm laufen. Selbst wenn keine Doxygen Kommentare im Programm enthalten sind, erhälst du so schon mal eine praktische Übersicht über das Projekt (Klassen-Diagramme etc.). Außerdem kannst du das Ergebnis immer als Referenz für dein weiteres Vorgehen nutzen und auch mit eigenen Kommentaren erweitern.

    Als nächstes könntest du das Programm mit dem Debugger durchgehen oder von einem Profiler dir einen Call-Graph erstellen lassen.

    Die Frage ist natürlich auch auf was du hinaus willst. Willst du das Programm in und auswendig können und verstehen oder willst du nur einen Fehler beheben oder ein Feature hinzufügen?



  • Naja, ich habe mich bis jetzt immer so in Programme eingearbeitet indem ich mir angesehen habe wie genau das funktioniert was ich ändern sollte. Den "erstmal einarbeiten damit man sich später auskennt" Fall hatte ich noch nicht.

    Guck dir einfach das Programm durch ... ich fange meist bei irgendeiner High Level Funktion an von der ich weiss was sie tut, und gucke dann wie sie es tut, also welche anderen Funktionen/Klassen wo vorkommen, was die tun etc.
    Solche High Level Funktionen deren Aufgabe man einfach "wissen" kann findet man normalerweise recht schnell, z.B. indem man main() durchgeht, bzw. bei GUI Programmen eben die diversen Message Handler die aufgerufen werden nachdem man auf nen Button gedrückt hat.

    Und 10000 LOC ist nicht wirklich so viel - wenn du etwas Glück hast, dann sind 70% davon sowieso Utility- und Glue-Code ohne besonders anspruchsvolle Logik.



  • Ein Feature wurde von einem anderen programmiert. Jetzt muss es in Simulator integriert werden. Meine Aufgabe ist es zu erkennen, was genau im Simulator geändert werden soll.
    Ich möchte erstmal eine Liste von den nötigen Änderungen erstellen und dann anfangen.

    Hier eine kleine Zusammenfassung der Vorschläge:

    1- Von main() aus die Aufrufpfade verfolgen
    2- Bei GUI Programmen die diversen Message HAndler die aufgerufen werden, nachdem man auf einen Button gedrückt hat
    3- Klassendiagramm erzeugen, um eine Übersicht zu schaffen
    4- Debugger + singlestep
    5- Sich von einem Profiler einen Call-Graphen erstellen lassen

    Wobei ich ehrlich gesagt bei 4 und 5 noch nicht genau weiss, wie man vorgeht.



  • cpplinux schrieb:

    Wobei ich ehrlich gesagt bei 4 und 5 noch nicht genau weiss, wie man vorgeht.

    Zu 4: Setz an der Stelle im Quellcode die Du dir anschauen möchtest einen Haltepunkt, und schau dir dann mal Schritt für Schritt an wo das Programm "hin springt".



  • Zu 5: spiel dir VTune drauf, starte das Programm unter VTune und lass es ne Zeitlang laufen. Dann guck dir den generierten Callgraphen an. Vorteil dabei: du siehst welche Funktion welche anderen Aufruft, bzw. auch in der anderen Richtung (von wem wird XYZ aufgerufen?), und pro Edge auch noch wie oft der Aufruf A->B stattgefunden hat.



  • Hallo,

    funktioniert das Vtune auch unter Eclipse/ Linux?



  • Nicht dass ich wüsste, aber es wird wohl ähnliche Tools geben, die ähnlich zu verwenden sind.
    War als Beispiel gedacht.



  • cpplinux schrieb:

    Hallo,

    funktioniert das Vtune auch unter Eclipse/ Linux?

    http://www.intel.com/cd/software/products/asmo-na/eng/239145.htm



  • Ich habe VTune zwar nie benutzt, doch es scheint das gleiche Ziel zu haben
    wie kcachegrind (http://kcachegrind.sourceforge.net/cgi-bin/show.cgi)

    kcachegrind stellt die Ausgaben von callgrind, was wiederum zu valgrind (http://valgrind.org) gehört, grafisch dar.

    Nachdem valgrind und kcachegrind installiert sind erstelle das Programm mit debugging Symbolen(so erkennt kcachegrind z.B. wo die quellen liegen).
    Dann...

    $ mkdir mein_analyse_ordner && cd mein_analyse_ordner 
    $ valgrind --tool=callgrind  /Pfad/zum/Programm Argumente
    .... jede Menge Ausgaben und eine Datei  cachegrind.out.xxx ...
    $ kcachegrind
    

    Die Dokumentation ist teilweise veraltet und irreführend, aber es ist ein super Werkzeug.

    MfG Maik



  • ich empfehle: http://www.scitools.com/products/understand/cpp/product.php
    es gibt 'ne kostenlose 30 tage testversion davon
    🙂



  • pale dog schrieb:

    ich empfehle: http://www.scitools.com/products/understand/cpp/product.php
    es gibt 'ne kostenlose 30 tage testversion davon
    🙂

    kann ich auch empfehlen !
    gibt ein ähnliches tool von redhat, kostet nichts,ist aber unübersichtlicher.
    heisst sourcenavigator


Anmelden zum Antworten