#c #c #memory
#c #c #память
Вопрос:
Я пытаюсь сделать снимок памяти, используемой большим приложением, работающим как в Unix, так и в Windows. Моей конечной целью было бы создать своего рода диаграмму с разбивкой памяти, используемой какой областью кода.
Программа разделена примерно на 30 различных проектов, большинство из которых являются либо статическими библиотеками, либо динамическими DLL. Некоторые из них написаны на C, некоторые на C , а другие представляют собой смесь этих двух. В общей сложности код во всех проектах составляет около 600 000 строк.
С помощью heap я мог бы попытаться перегрузить все ‘malloc / free’ и ‘new / delete’ во всех проектах и отслеживать их таким образом, но это довольно сложно для приложения такого размера.
Кроме того, это не позволило бы собрать все статические глобальные данные, разбросанные по проектам.
Спасибо за любую помощь.
Ответ №1:
Вы могли бы попробовать valgrind. Вот цитата об одном из инструментов:
Массив
Massif — это профилировщик кучи. Он выполняет подробное профилирование кучи, делая регулярные снимки кучи программы. Он создает график, показывающий использование кучи с течением времени, включая информацию о том, какие части программы отвечают за наибольшее выделение памяти. График дополняется текстовым или HTML-файлом, который содержит дополнительную информацию для определения того, где выделяется больше всего памяти. Massif запускает программы примерно в 20 раз медленнее обычного.
Сейчас он поддерживается в Linux, но если выполнение анализа в Linux и применение результатов к версии Windows работает для вас, это может вам помочь.
Ответ №2:
Если вы работаете с двоичными файлами ELF, вы могли бы проверить объектные файлы «*.o» перед подключением к анализатору elf и посмотреть, насколько велики разделы статической памяти и какой размер будут иметь bss (неинициализированные статические данные) после загрузки.