Analysetool Speicherlayout



  • Jup, mit ddd habe ich auch schon in C Speicherabbilde grafisch angezeigt bekommen. Ist insbesondere bei Pointern und structs sehr schön. Mit C++ dürfte das sicherlich auch funktionieren.



  • Ich meine _keinen_ Debugger.



  • 314159265358979 schrieb:

    Ich meine _keinen_ Debugger.

    Steffo schrieb:

    Jup, mit ddd habe ich auch schon in C Speicherabbilde grafisch angezeigt bekommen. Ist insbesondere bei Pointern und structs sehr schön. Mit C++ dürfte das sicherlich auch funktionieren.

    http://webscripts.softpedia.com/scriptScreenshots/GNU-DDD-Screenshots-26910.html



  • Was spricht gegen Debugger?



  • @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.


Anmelden zum Antworten