Siedzę w temacie analizy pamięci w .NET już jakiś czas. Zaczęło się od potrzeby, kilka lat temu - produkcyjne systemy miały jakiś wyciek i trzeba było namierzyć dziada. Złapałem bakcyla. Potem jeszcze wiele razy miałem okazję 'dłubać w dumpach'. Używałem już chyba wszystkich dostępnych na rynku narzędzi, wielokrotnie. Widziałem jak niektóre zmieniały się wraz z kolejnymi wersjami. Choć i tak 80% spraw rozwiązywałem ostatecznie w WinDbg. Narzędzi mamy więc naprawdę dużo i fajnych. Wymieniając choćby .NET Memory Profiler, ANTS Memory Profiler, jetBrains dotMemory.
Po co zatem kolejne narzędzie? Z potrzeby oczywiście. Żadne z mi znanych nie oferuje wygodnej i ładnej wizualizacji zawartości pamięci. Przyznaję, jest to potrzeba dość niszowa, dlatego zapewne jeszcze się nie pojawiła w dojrzałej formie. Oczywiście można rysować grafy obiektów, jak poniżej - przykład z .NET Memory Profilera:
Można nawet rysować całe regiony pamięci, jak w darmowym CLRProfilerze:
Ale wciąż to nie to. Potrzebuję, jak wspomniałem, ładnej wizualizacji. Do artykułów, prezentacji, książki. Potrzebuję pokazywać pamięć, obiekty w niej zawarte, relacje pomiędzy nimi, w najróżniejszy sposób. Kolorki, strzałki, etykiety itd. Wszystko to niekoniecznie nawet na potrzeby analizy problemów - choć i tu narządko może się przyda. Wizualizacja - o to głównie chodzi.
Oczywiście brzmi to prosto, ale jest ukryte dno. Aby dobrze narządko zaimplementować muszę doskonale zrozumieć zarządzanie pamięcią w .NET. Po drugie, docelowo chodzi o analizę gigabajtów danych i ich szybką wizualizację, więc jest to spore wyzwanie. No i potrzeba mi wygodnego sposobu definiowania, co chcę dokładnie wizualizować. Potrzeba mi języka zapytań. Zdecydowanie nie chcę na sztywno zakodować kilku widoków, które można sobie obejrzeć. Nazwijcie to "SQL over CLR Memory"!
Jak to wszystko sobie docelowo wyobrażam? Najprościej będzie to wytłumaczyć na poniższych schematach - nazwijcie je prototypami jeśli chcecie. Takie, tutaj wyrysowane ręcznie, grafiki chciałbym móc generować za pomocą MemoryVisualizera.
Jak widać, język zapytań i silnik rysowania musi być na tyle elastyczny, by móc wizualizować na różnych poziomach szczegółowości. Muszę być w stanie wyświetlić graf kilku obiektów mających referencję do innego obiektu, ale muszę też być w stanie wyświetlić na mapie całej pamięci procesu miejsca, gdzie znajdują się obiekty zawierające np. konkretną wartość konkretnego pola.
Jeśli uda się napisać narzędzie, które implementuje możliwość narysowania diagramów jak powyżej, za pomocą jakiegoś sprytnego języka zapytań, operującego bądź to na memory dumpie, bądź na podłączonym debuggerem procesie - cel zostanie osiągnięty!
Jeszcze odnośnie nazwy - jest wybrana na zasadzie "byle była". Chciałem uniknąć typowego błędu poświęcania tygodni na wybranie tej idealnej, błyskotliwej, zaskakującej. Traktuję to jako nazwę kodową, bo github (tak, w chwili pisania całkiem pusty) potrzebował czegoś w polu "name".
Pierwszy wpis jest opisem funkcjonalności, o konkretnych technologiach i podejściu do projektu będzie część II - technikalia.
Post ten jest częścią serii wpisów dotyczących realizacji projektu MemoryVisualizer w ramach konkursu "Daj się poznać".