Как отслеживать/исправлять проблемы, связанные с памятью, в большом коде C/C++ на системах *nix

Как отслеживать/исправлять проблемы, связанные с памятью, в большом коде C/C++ на системах *nix

Какую стратегию вы используете при отслеживании проблем, связанных с памятью? Какие инструменты вы используете (как с открытым исходным кодом, так и фирменные) для выявления утечек памяти, повреждений памяти и т. д.? Как бы вы отслеживали утечки памяти, если бы в системе был доступен только 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, то стоит попробовать.

Связанный контент