
Какую стратегию вы используете при отслеживании проблем, связанных с памятью? Какие инструменты вы используете (как с открытым исходным кодом, так и фирменные) для выявления утечек памяти, повреждений памяти и т. д.? Как бы вы отслеживали утечки памяти, если бы в системе был доступен только gdb/dbx?
Для меня исправление утечек памяти с помощью только отладчика — очень сложная задача.
решение1
Если вы можете изменить исходный код,Dmallocэто здорово; он выведет список указателей, которые были освобождены, и (для кода, созданного с использованием отладочных символов) на какой именно строке они были выделены.
Если не можешь,Вальгриндв значительной степени является стандартом для такого рода вещей. Я обычно нахожу Valgrind немного более сложным в использовании, но у него гораздо больше функций и он не требует добавления вызовов dmalloc в ваш код
решение2
valgrind невероятно полезен.
решение3
Массив(из valgrind) — один из лучших способов найти утечки памяти. Повторите подозрительный код (или запустите программу достаточно долго) и выведите результат с помощью ms_print. Обычно стек вызовов дает вам достаточно информации, чтобы исправить это.
С помощью GDB вы можете попытаться подключиться к работающей программе и вызвать такие функции, какmalloc_stats()
Если ваша программа написана на другом языке, это может быть сложнее. Недавно некоторые GDB получили возможность скриптования, и люди начали интересные проекты, такие какgdb-куча, который может анализировать память Python из дампа ядра. Аналогичные скрипты анализа памяти могут быть возможны для объектов C++.
Читайте такжеhttps://stackoverflow.com/questions/2564752/examining-cc-heap-memory-statistics-in-gdb
решение4
Я уже некоторое время работаю с Objective-C, и есть анализатор, который занимается управлением памятью на уровне C и тому подобными вещами.Статический анализатор Clangнастолько хорош, что Apple решила объединить его со своей xCode IDE. Я не уверен, подходит ли это для вашего вопроса, но если вы пишете на C, то стоит попробовать.