Analysetool Speicherlayout



  • Ich will aber ne grafische Darstellung.



  • ddd



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


Anmelden zum Antworten