Як відстежувати / виправляти проблему, пов’язану з пам’яттю, у великому коді C / C ++ у * nix-системах


9

Яку стратегію ви використовуєте під час відстеження проблеми, пов’язаної з пам’яттю? Які інструменти ви використовуєте (з відкритим кодом, а також власником) для виявлення витоків пам'яті, пошкодження пам’яті тощо? Як би ви відстежували протікання пам'яті, якщо в системі доступні лише gdb / dbx?

Для мене виправлення витоків пам'яті лише за допомогою налагоджувача дуже важко.


2
Особисто я вважаю, що це питання стосується більше програм, ніж unix.
phunehehe

Відповіді:


12

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

Якщо ви не можете, Valgrind - це майже стандарт для такої речі. Я, як правило, Valgrind дещо складніший у використанні, але він має багато додаткових функцій і не передбачає додавання дзвінків dmalloc у свій код


dmalloc не дуже ефективний, як очікувалося в дуже великих системах. valgrind - краща ставка, і навіть там ви потрапите в вузькі місця ...

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


2

Масив (від valgrind) - один з найкращих способів пошуку витоків пам’яті. Повторіть свій підозрілий код (або запустіть програму досить довго) та скиньте результат за допомогою ms_print. Зазвичай стек викликів дає вам достатньо інформації для її виправлення.

За допомогою GDB можна спробувати приєднати до запущеної програми та функцій виклику, таких як malloc_stats()

Якщо ваша програма написана іншою мовою, це може бути складніше. Нещодавно деякі GDB отримали можливість написання, і люди розпочали цікаві проекти, такі як gdb-heap , які можуть аналізувати пам'ять Python з основного дампа. Подібні сценарії analysys пам'яті можуть бути можливі для об'єктів C ++.

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


1

Для Solaris існує кілька інструментів, перелічених у відповідях на це питання StackOverflow (вони включають перевірку протікання з іншими формами поганого доступу до пам'яті).


1

Я вже деякий час займаюся Objective-C, і є аналізатор, який займається управлінням пам'яттю рівня C і подібними подібними матеріалами. Статичний аналізатор Clang настільки гарний, що Apple вирішила поєднати його зі своїм IDC xCode. Я не впевнений, чи добре це для вашого питання, але якщо ви робите C, то варто спробувати.


Незначна приказка: clang був розроблений для використання в xcode з самого початку. Дивіться clang.llvm.org/clang_video-05-25-2007.html
Даніель Джеймс

Привіт, Даніеле, це може бути правдою, але він не був включений до xCode до недавнього часу (або принаймні не в комплекті, який я завантажив з Apple)
phunehehe
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.