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

9

Какую стратегию вы используете при отслеживании проблем, связанных с памятью? Какие инструменты вы используете (с открытым исходным кодом и проприетарные) для выявления утечек памяти, повреждения памяти и т. Д.? Как бы вы отслеживали утечки памяти, если бы в системе был только gdb / dbx?

Для меня исправление утечек памяти только с помощью отладчика очень сложно.

Hemant
источник
2
Лично я думаю, что этот вопрос больше связан с программированием, чем с Unix.
phunehehe

Ответы:

12

Если вы можете изменить исходный код, Dmalloc отлично подходит; в нем будет указан список указателей, которые были освобождены, и (для кода, созданного с помощью символов отладки), в какой именно строке они были размещены.

Если вы не можете, Valgrind в значительной степени стандарт для такого рода вещей. Я обычно нахожу Valgrind несколько сложнее в использовании, но он имеет гораздо больше возможностей и не требует добавления вызовов dmalloc в ваш код

Михаил Мрозек
источник
dmalloc не очень эффективен, как ожидается в очень больших системах. valgrind - лучшая ставка, и даже там вы попадете в узкие места ...
valgrind --tool memcheck "yourapp" выдаст информацию, связанную с памятью, во время выполнения (полезно в настольных системах). Еще один замечательный инструмент - memwatch, но его следует скомпилировать вместе с исходным кодом. Memwatch может записывать подробности в файл, следовательно, больше подходит для встроенных систем.
rajaganesh87
7

Валгринд удивительно полезен.

jacksonh
источник
2

Массив (из Valgrind) является одним из лучших способов обнаружения утечек памяти. Повторите ваш подозрительный код (или запустите программу достаточно долго) и выведите результат с помощью ms_print. Обычно стек вызовов дает вам достаточно информации, чтобы исправить это.

С помощью GDB вы можете попытаться подключиться к работающей программе и вызвать такие функции, как malloc_stats()

Если ваша программа написана на другом языке, это может быть сложнее. Недавно некоторые GDB получили возможность написания сценариев, и люди начали интересные проекты, такие как gdb-heap , которые могут анализировать память Python из дампа ядра. Подобные сценарии анализа памяти могут быть возможны для объектов C ++.

Читайте также /programming/2564752/examining-cc-heap-memory-statistics-in-gdb

Elmarco
источник
1

Для Solaris есть несколько инструментов, перечисленных в ответах на этот вопрос StackOverflow (они включают проверку на утечку с другими формами плохого доступа к памяти).

alanc
источник
1

Я некоторое время делал Objective-C, и есть анализатор, который занимается управлением памятью на уровне C и тому подобными вещами. Clang Static Analyzer настолько хорош, что Apple решила связать его со своей IDE xCode. Я не уверен, что это хорошо для вашего вопроса, но если вы делаете C, то стоит попробовать.

phunehehe
источник
Незначительный спор: clang был разработан для использования в xcode с самого начала. См. Clang.llvm.org/clang_video-05-25-2007.html
Даниэль Джеймс
Привет, Дэниел, это может быть правдой, но до недавнего времени он не был включен в xCode (или, по крайней мере, в комплект, который я скачал с Apple)
phunehehe