
Memoro: Ein detaillierter Heap-Profiler
Memoro ist ein hochdetaillierter Heap-Profiler.
Memoro zeigt Ihnen nicht nur, wo und wann Ihr Programm Heap-Allokationen vornimmt, sondern auch, wie Ihr Programm diesen Speicher tatsächlich genutzt hat.
Memoro sammelt detaillierte Informationen über Zugriffe auf den Heap, einschließlich Lese- und Schreibvorgänge auf den Speicher und deren Zeitpunkte, um Ihnen eine Vorstellung davon zu geben, wie effizient Ihr Programm den Heap-Speicher nutzt.
Memoro enthält eine Visualisierungsanwendung, die all diese Informationen in Bewertungen und Indikatoren destilliert, um Ihnen bei der Identifizierung von Problembereichen zu helfen.

Für detailliertere Informationen zur Funktionsweise von Memoro siehe hier
Die folgenden Schritte beschreiben eine Schnellstartanleitung zur Verwendung von Memoro. Detaillierte Einrichtungsanweisungen finden Sie hier. Eine Anleitung zur Verwendung von Memoro finden Sie hier.
Zuerst müssen Sie eine lokale Version von LLVM/Clang erstellen, damit Sie Ihren Code mit Memoro-Instrumentierung kompilieren können. Vorgefertigte Releases sind noch nicht verfügbar, aber wenn genug Leute mich nerven, werde ich sie vielleicht hier hosten.
Befolgen Sie die LLVM/Clang-Bauanleitung hier, verwenden Sie jedoch die unten aufgeführten spezifischen Repositories. Memoro befindet sich noch nicht im LLVM/Clang-Entwicklungszweig.
Es wird empfohlen, die Git-Mirror-Repositories anstelle von SVN zu verwenden. Für das Haupt-LLVM-Repo, das Clang-Repo und das CompilerRT-Repo verwenden Sie die Memoro-Versionen:
Diese Repositories sollten standardmäßig auf den Branch memoro_80 eingestellt sein.
Klonen Sie dieses Repo mit git clone [email protected]:epfl-vlsc/memoro.git
Wechseln Sie in das Verzeichnis.
$ cd memoro
Führen Sie npm install aus, um sicherzustellen, dass alle JS-Abhängigkeiten vorhanden sind.
Sie müssen dann das C++-Datenverarbeitungs-Addon erstellen.
Dazu müssen Sie möglicherweise zuerst node-gyp installieren (npm install -g node-gyp)
Dann,
cd cpp
node-gyp build --release --target=1.7.9 --arch=x64 --dist-url=https://atom.io/download/electron
cd ..
Das target ist die Electon-Version, die mit der zum Ausführen der Hauptanwendung verwendeten übereinstimmen muss.
Passen Sie dies bei Bedarf an.
Passen Sie auch arch bei Bedarf an, jedoch habe ich noch nicht auf nicht-*nix x64 Systemen getestet.
Es gibt auch ein Makefile, das für die meisten Benutzer funktionieren sollte.
Offensichtlich benötigen Sie einen installierten C++-Compiler, den node-gyp verwenden kann.
Erstellen Sie zuerst die Software, die Sie profilieren möchten, mit dem zuvor erstellten LLVM/Clang.
Fügen Sie das Compiler-Flag -fsanitize=memoro hinzu, um die Instrumentierung hinzuzufügen, und optional -fno-omit-frame-pointer, um schöne Stack-Traces zu erhalten.
Wenn Sie einen separaten Link-Schritt haben, benötigt dieser möglicherweise auch -fsanitize=memoro, um sicherzustellen, dass die Memoro/Sanitizer-Laufzeitumgebung verlinkt wird.
Es wird empfohlen, den LLVM-Symbolizer für Stack-Traces zu verwenden. Setzen Sie die Umgebungsvariable MEMORO_SYMBOLIZER_PATH so, dass sie auf den Speicherort von llvm-symbolizer verweist.
Oder legen Sie es einfach in Ihrem PATH ab.
Führen Sie Ihr Programm aus. Nach Abschluss erzeugt die Memoro-Laufzeitumgebung zwei Dateien, *.trace und *.chunks. Diese können mit dem Visualizer geöffnet und angezeigt werden.
Nach dem Erstellen des C++-Addons kann die App direkt aus dem Repo-Verzeichnis ausgeführt werden
electron .
Datei->Öffnen oder Cmd/Ctrl-O zum Öffnen, navigieren Sie zu und wählen Sie entweder die Trace- oder die Chunk-Datei aus.
Viel Spaß bei der Jagd nach Heap-Problemen :-)
Verwenden Sie electron-packager, um den gesamten Code und die Assets in ein Anwendungspaket zu sammeln und zu exportieren.
electron-packager . --overwrite --platform=<platform> --arch=x64 --electron-version=1.7.9 --icon=assets/icons/icon64.icns --prune=true --out=release-builds
Passen Sie wiederum Plattform, Architektur und Electron-Version bei Bedarf an.
Beiträge sind mehr als willkommen. Bitte reichen Sie einen Pull-Request ein oder nehmen Sie Kontakt auf.