Робота з dmalloc

dmalloc - бібліотека для виявлення проблем роботи з пам'яттю - витоків пам'яті, звернення до областей пам'яті за межами виділених блоків (також як і Electric Fence), а також збирання різної статистики з виділення пам'яті. Ця бібліотека перевизначає стандартні функції виділення та звільнення пам'яті. Бібліотека написана в портабельному стилі і може бути використана на Linux, Solaris та інших Unix-сумісних системах, включаючи MS Windows (в середовищі Cygwin) 1 .

На мій погляд, в даний час використання цієї бібліотеки не є особливо виправданим, оскільки є більш потужні альтернативи — Valgrind і Google Performance Tools.

Також як і багато пакетів для Unix, dmalloc збирається досить просто — необхідно завантажити вихідні тексти з сайту, розпакувати та виконати три команди:

Якщо ви будете використовувати dmalloc з багатопотоковими програмами, то вам потрібно буде передати параметр --enable-threads скрипту configure .

Використання

Так само як і інші пакети, призначені для пошуку помилок роботи з пам'яттю, використовувати dmalloc дуже просто – вам потрібно об'єднати бібліотеку з програмою, або завантажити її за допомогою LD_PRELOAD. 2 Варто зазначити, що є дві версії бібліотеки: для програм мовою C — libdmalloc , і програм на C++ — libdmallocthcxx . 3 Друга бібліотека, крім підтримки стандартних malloc & free, також підтримує оператори C++ для роботи з пам'яттю - new, new [] і т.п.

Аналогічно іншим пакетам, libdmalloc також отримує інформацію про налаштування змінних середовища. Деякою відмінністю є те, що до складу пакету входить командно-рядкова утиліта dmalloc, яку можна використовувати для встановлення конкретних змінних, не вказуючи їх імен і не вдаючись особливо синтаксисукомандного процесора 4 . У типовій ситуації dmalloc використовується наступним чином:

наявність команди eval необхідно, оскільки якщо просто викликати dmalloc , він виведе на екран команди встановлюючу змінну середовища DMALLOC_OPTIONS , а чи не встановить їх 5 . Залежно від командного процесора, що використовується, dmalloc необхідно вказати конкретну опцію: -b для процесорів, сумісних за синтаксисом з sh - bash , zsh та інші, і -c для тих, що використовують csh -сумісний синтаксис.

Крім того, користувач повинен вказати рівень подробиці, з якою буде проводитися перевірка (debug level). Існує кілька зумовлених значень (low, runtime, medium і high) які задають зумовлені набори перевірок (від мінімальних до максимальних), але користувач може задати і власні набори перевірок, використовуючи опцію -d утиліти dmalloc для завдання числа, що описує потрібні перевірки, -p , яка дозволяє встановити перевірки використовуючи їх імена, наприклад:

В даному випадку опція -d обнуляє виставлені прапори, а потім за допомогою опцій -p формується новий набір прапорів перевірок 6 . Повний список доступних перевірок можна отримати, передавши dmalloc опції -DV , що призведе до виведення назв перевірок, їх коротких описів, а також числових значень, що їм відповідають.

Серед інших опцій, що передаються dmalloc , найбільш часто використовується опція -l (або --logfile ), яка дозволяє вказати ім'я файлу в який буде виводитися звіт.

Аналіз результатів роботи

Після завершення роботи аналізованої програми у вказаному файлі ми отримаємо інформацію про помилки, знайдені під час роботи. У наведеному нижче прикладі, програма робила спробу звільнити вже звільнений блок пам'яті, що було зазначено впередостанньому рядку звіту 7:

Якщо у програмі є помилки, що призводять до витоків пам'яті, то у звіті з'являться рядки, подібні до наведених у прикладі:

Крім виведення даних про знайдені помилки, libdmalloc виводить дані про виділення пам'яті, кількість викликів конкретних функцій і т.п. речах, наприклад:

1. Бібліотека може використовуватися для виявлення проблем та у багатопотокових програмах.

2. Для отримання детальної інформації про файли з вихідними текстами та конкретні рядки, що викликали появу помилок, користувач може скомпілювати свою програму підключивши заголовний файл dmalloc.h . Про це можна детальніше прочитати у документації.

3. Бібліотеки призначені для роботи з багатопотоковими програмами мають суфікс th, наприклад: libdmallocth.so.4

4. Користувач може також встановити опції, які будуть використовуватися при кожному запуску dmalloc . Для цього треба вказати необхідні опції у файл налаштування

5. У документації наводиться кілька прикладів команд для командного процесора, які дозволять користувачеві явно не вказувати команду eval .

6. Варто зазначити, що при послідовних дзвінках dmalloc відбувається збереження значень, які не змінюються поточним дзвінком. Користувач може явно вказати на те, що не зазначені значення були видалені, використовуючи опцію -r або збережені, якщо задана опція -k.

7. У цьому прикладі, тестова програма була скомпільована з підключенням файлу dmalloc.h , щоб бібліотека отримала дані про номери рядків у файлі. У тому випадку, якщо ви не можете перезбирати вихідні тексти, ви можете отримати інформацію про номери рядків, використовуючи gdb, як це описано в документації.