Analysetool Speicherlayout



  • @Steffo:
    Nur Pi's Sturheit.
    Und/oder die strenggeheimen Gründe/zusätzlichen Anforderungen die er uns nicht verraten darf.



  • hustbaer schrieb:

    @Steffo:
    Nur Pi's Sturheit.

    Genau, Pi ist einfach total irrational, das weiß man aber...



  • Wieso muessen die Linux GUIs immer so haesslich sein? Das sieht ja aus wie Windows 3.11. 👎

    Dass Pi ein bockiges Kleinkind ist, ist ja schon laenger bekannt.



  • IDA PRO

    Ist ein Disassembler kein Debugger.^^



  • Ich will den Code nicht kompilieren müssen, um mir das anzusehen. Wozu auch.



  • Ich glaub so ein Programm gibt es nicht.^^

    Versuch aus dem Code in deiner Klasse einfach die entsprechenden Opcodes zu generieren. Das packste dann in den Virtuellen Adressraum und ließt es mit ReadProcesMemory oder so aus.

    Aus dem Hochsprachen Code die passenden Opcodes generieren zu lasse ist denke ich mal das schwierigste.(Stichwort Compiler Entwicklung).

    Opcode in den VirtualAdress Space laden.
    [Du solltest die Opcodes aber noch anpassen das dir der ganze kram nicht sofort abstürtzt.^^]

    #include <iostream>
    int main()
    {
    char opcodes[]="\x90"; // NOP
    int (*call)();
    
    call = (int (*)()) opcodes;
    
    (*call)();
    
    return 0;
    }
    


  • 314159265358979 schrieb:

    Ich will den Code nicht kompilieren müssen, um mir das anzusehen. Wozu auch.

    Wie soll das gehen? Das Speicherlayout hängt doch vom Compiler ab.



  • Bashar schrieb:

    Wie soll das gehen? Das Speicherlayout hängt doch vom Compiler ab.

    Indem man es lediglich Schemenhaft aufzeichnet und davon ausgeht, dass der Compiler keine Paddingbytes einbaut.


  • Mod

    314159265358979 schrieb:

    Bashar schrieb:

    Wie soll das gehen? Das Speicherlayout hängt doch vom Compiler ab.

    Indem man es lediglich Schemenhaft aufzeichnet und davon ausgeht, dass der Compiler keine Paddingbytes einbaut.

    Du möchtest ein UML-Diagramm erzeugen?



  • SeppJ schrieb:

    314159265358979 schrieb:

    Bashar schrieb:

    Wie soll das gehen? Das Speicherlayout hängt doch vom Compiler ab.

    Indem man es lediglich Schemenhaft aufzeichnet und davon ausgeht, dass der Compiler keine Paddingbytes einbaut.

    Du möchtest ein UML-Diagramm erzeugen?

    Um SeppJ's Antwort aufzuführen: Microsoft's Visio hat ein Reverse-Engineering Plugi-In für Visual Studio.



  • 314159265358979 schrieb:

    Bashar schrieb:

    Wie soll das gehen? Das Speicherlayout hängt doch vom Compiler ab.

    Indem man es lediglich Schemenhaft aufzeichnet und davon ausgeht, dass der Compiler keine Paddingbytes einbaut.

    Wenn du es schemenhaft sehen willst, dann mach nen Screenshot vom Source-Code.


  • Mod

    Tippgeber schrieb:

    Um SeppJ's Antwort aufzuführen: Microsoft's Visio hat ein Reverse-Engineering Plugi-In für Visual Studio.

    Um meine Antwort noch weiter auszuführen: So etwas fällt bei so ziemlich jedem Dokumentations- oder (statischem) Codeanalysetool nebenher ab. Da Pi, wenn ich mich recht erinnere, auf Mac entwickelt, wäre da vielleicht Doxygen was für ihn. Das kann, entgegen seinem Haupteinsatzbereich, auch einfach nur Bildchen von Klassen erzeugen, ganz ohne Doku drumherum.



  • Ich hab hier mal ein kleines Beispiel als ASCII Art zusammengebastelt.
    Code:

    template <typename T>
    struct foo
    {
    	T value;
    };
    
    template <typename T>
    struct bar
    {
    	unique_ptr<foo<T>> foo_ptr;
    };
    

    Die Ausgabe des Programms könnte dann so aussehen:

    +--------------------------------------+
    | struct bar<typename T>               |
    +--------------------------------------+
    | foo_ptr: +--------------------------+|
    |          | class unique_ptr<foo<T>> ||
    |          +--------------------------+|         +---------------+
    |          | internal_ptr: foo<T>*    || ------> | struct foo<T> |
    |          +--------------------------+|         +---------------+
    +--------------------------------------+         | value: T      |
                                                     +---------------+
    


  • struct bar<typename T> ist kein Typ, sondern ein Template.
    Ein Template hat kein "Speicherlayout", wenn dann müsstest du es schon instanzieren.

    Tool das sowas macht ohne dass du erstmal compilieren musst kenne ich auch nicht. C++ ist da nicht die passende Sprache dafür, denn um zu ermitteln was überhaupt abgehen soll muss halt nunmal compiliert werden.
    Die Code-Generation kann man sich sparen, aber der Rest muss sein.

    Denk an Makros, Template Metaprogramming etc.



  • 314159265358979 schrieb:

    Ich hab hier mal ein kleines Beispiel als ASCII Art zusammengebastelt.

    Das ist kein Speicher Layout, das ist ein UML Diagramm (mehr oder weniger).

    Du suchst also ein Tool, dass dir aus Source Code UML Diagramme erzeugt.
    Doxygen kann das zB. Oder Tools wie StarUML.

    Das ganze klappt natuerlich nicht sonderlich toll mit komplexen Code. Aber das ist halt UML - das kann mit praxisrelevanten Code nicht umgehen.

    Viel interessanter waere: was willst du erreichen? Willst du dir einen Ueberblick ueber ein Projekt verschaffen? Willst es Dokumentieren? Was ist das Ziel?



  • hustbaer schrieb:

    struct bar<typename T> ist kein Typ, sondern ein Template.
    Ein Template hat kein "Speicherlayout", wenn dann müsstest du es schon instanzieren.

    Die Member liegen trotzdem bei jeder Instanzierung in der selben Reihenfolge hintereinander...

    Shade Of Mine schrieb:

    Das ist kein Speicher Layout, das ist ein UML Diagramm (mehr oder weniger).

    Ich hab ich an UML orientiert, sollte aber sowieso nur ein Beispiel sein. Warum das kein Speicherlayout sein soll, ist mir nicht klar.

    Shade Of Mine schrieb:

    Du suchst also ein Tool, dass dir aus Source Code UML Diagramme erzeugt.

    Ich suche ein Tool, das mir genau diese Art von Diagrammen erzeugen kann. Bisher kenne ich UML nur so, dass man jede Klasse ein einziges mal aufzeichnet und dann (vereinfacht gesagt) Striche zieht für Hierarchien.

    Shade Of Mine schrieb:

    Das ganze klappt natuerlich nicht sonderlich toll mit komplexen Code. Aber das ist halt UML - das kann mit praxisrelevanten Code nicht umgehen.

    Deshalb eben kein UML, sondern eben irgendwas, das vernüntige Diagramme zeichnen kann.

    Shade Of Mine schrieb:

    Viel interessanter waere: was willst du erreichen? Willst du dir einen Ueberblick ueber ein Projekt verschaffen? Willst es Dokumentieren? Was ist das Ziel?

    Ich sehe mir glglt Code von fremden Libraries an und finde es unglaublich nervig, mich durch zig Header (Besonders bei Boost) wühlen zu müssen, um langsam irgendwie einen Überblick zu bekommen. Einfach nur Interesse, was da so abgeht in deren Code. 🙂
    Ein weiterer Grund ist, dass ich meinen eigenen Code analysieren will, um mögliche, unnötige Indirektionen loszuwerden.



  • 314159265358979 schrieb:

    hustbaer schrieb:

    struct bar<typename T> ist kein Typ, sondern ein Template.
    Ein Template hat kein "Speicherlayout", wenn dann müsstest du es schon instanzieren.

    Die Member liegen trotzdem bei jeder Instanzierung in der selben Reihenfolge hintereinander...

    Nur bis du anfängst mit Spezialisierungen rumzubasteln.

    Aber ich verstehe jetzt was du meinst.
    Kenne aber ausser den bereits genannten (Doxygen und Debugger) nix brauchbares. Wobei Doxygen für sowas auch nur bedingt brauchbar ist.

    Ich hüpfe meistens einfach mit VisualAssist X durch die Files und gucke was da abgeht. Und wenn mir das zu funky wird, dann werf ich den Debugger an.

    Bzw. für eigene Sachen eignet sich Doxygen ganz gut, da kann man ja immerhin (mit mehr oder weniger Aufwand) dafür sorgen dass der Output brauchbar wird.



  • Ich glaube, dass Doxygen schon ganz gute Diagramme für so etwas hat. Wir haben so etwas in unserem projekt:

    http://image.diku.dk/shark/doxygen_pages/html/classshark_1_1_labeled_data.html

    Das Colaborationdiagramm sollte in etwa das sein, was du suchst. Die Member kann man wohl noch rauskonfigurieren.

    Andererseits versagts gerne mal völlig, wenn man die default konfiguration lässt:
    http://image.diku.dk/shark/doxygen_pages/html/classshark_1_1detail_1_1_loss_based_error_function_wrapper.html



  • 314159265358979 schrieb:

    hustbaer schrieb:

    struct bar<typename T> ist kein Typ, sondern ein Template.
    Ein Template hat kein "Speicherlayout", wenn dann müsstest du es schon instanzieren.

    Die Member liegen trotzdem bei jeder Instanzierung in der selben Reihenfolge hintereinander...

    Ne. Der Compiler darf private/protected/public reordern wie er will. Und Padding Bytes gibts ja auch noch. Und die vtable kommt auch noch rein oder nicht.

    Ich suche ein Tool, das mir genau diese Art von Diagrammen erzeugen kann. Bisher kenne ich UML nur so, dass man jede Klasse ein einziges mal aufzeichnet und dann (vereinfacht gesagt) Striche zieht für Hierarchien.

    Und inwiefern willst du etwas anderes?
    Du willst ein Viereck für die Klasse und dann Striche zu anderen Vierecken.

    Ich sehe mir glglt Code von fremden Libraries an und finde es unglaublich nervig, mich durch zig Header (Besonders bei Boost) wühlen zu müssen, um langsam irgendwie einen Überblick zu bekommen. Einfach nur Interesse, was da so abgeht in deren Code. 🙂
    Ein weiterer Grund ist, dass ich meinen eigenen Code analysieren will, um mögliche, unnötige Indirektionen loszuwerden.

    Doxygen. Javadoc, etc. Diese Tools machen genau das. Du hast dann eine grafische Repräsentation des Beziehungen der Klassen zueinander aber gleichzeitig kannst du auch immer an die relevante Stelle im Source Code springen.



  • Shade Of Mine schrieb:

    Ne. Der Compiler darf private/protected/public reordern wie er will. Und Padding Bytes gibts ja auch noch. Und die vtable kommt auch noch rein oder nicht.

    Das sind alles Optimierungen, die für das Diagramm völlig egal sind.

    Shade Of Mine schrieb:

    Und inwiefern willst du etwas anderes?
    Du willst ein Viereck für die Klasse und dann Striche zu anderen Vierecken.

    Ich will Striche/Pfeile wenn das Ding ein Zeiger/eine Referenz ist. Also immer dann, wenn etwas an einer anderen Stelle im Speicher liegt.


Anmelden zum Antworten