Вступ до використання Valgrind. Пошук витоків пам'яті

Valgrind — потужний набір знадобів для зневадження роботи з оперативною пам'яттю, пошуку витоків пам'яті та профілювання.

Містить наступні модулі:

• memcheck: основний модуль, застосовується для пошуку витоків пам'яті та інших помилок пов'язаних з неправильною роботою з областями пам'яті — читанням і записом за межі виділених областей і т.д.

• cachegrind: аналізує виконання коду, збираючи дані про (не)потрапляннях до кешу і точках переходу (коли процесор не правильно передбачує розгалуження).

• callgrind: аналізує виклики функцій, використовуючи приблизно ту ж методику, що й модуль cachegrind. Дозволяє побудувати дерево викликів функцій, і відповідно, проаналізувати вузькі місця у роботі програми.

• massif: аналізує виділення пам'яті різними частинами програми

• helgrind: аналізує виконавчий код на наявність різноманітних помилок синхронізації при використанні багатопотокового коду, використовуючи POSIX Threads.

Найчастіши використовується для пошуку витоків пам'яті. Для цього призначений модуль memcheck, який уміє шукати:

• touching memory you shouldn’t (eg. overrunning heap block boundaries);

• використання змінних до їхньої ініціалізації;

• некоректне звільнення пам'яті;

• витоки пам'яті.

1. Підготовка програми

Для того, щоб програма була придатною для зневадження, її слід зібрати зі зневаджувальною інформацією (ключик -g), тоді модель memcheck зможе вказати на конкртений рядок джрелеьних текстів, в якому знаходиться помилка. Також варто відключити будь яку оптимізацію (ключ -O0), інакше memcheck почне видавати некоректну інформацію.

2. Запуск програми під mecmcheck`ом

Якщо ви запускаєте свою програму, як:

# myprog arg1 arg2

Використайте наступну команду:

# valgrind --tool=memcheck --leak-check=yes myprog arg1 arg2

Значення опції --tool вказує на необхідний для використання знадіб, однак, memcheck є модулем, який запускається за замовчуванням. тож запускаючи valgrind, його вказувати не обов'язково. Опція --leak-check вмикає деталізований пошук витоків пам'яті.

Ваша програма працюватиме значно повільніше (у ркзів 20 — 30), ніж звичайно, і використовуватиме значно більше оперативної пам'яті.

3. Інтерпретація виводу memcheck`а

Ось приклад простої програми на С, яка містить помилку неправильного використання оперативної пам'яті та витоки пам'яті:

#include <stdlib.h>


void f(void)
{
    int* x = malloc(10 * sizeof(int));
    x[10] = 0; // проблема 1: перепровнення буферу
} // проблема 2: витік пам'яті — x не звільнено

int main(void)
{
    f();
    return 0;
}

Більшість повідомлень про помилки виглядають наступним чином. Тут описується проблема №1, перепровнення буфера:

==19182== Invalid write of size 4
==19182== at 0x804838F: f (example.c:6)
==19182== by 0x80483AB: main (example.c:11)
==19182== Address 0x1BA45050 is 0 bytes after a block
             of size 40 alloc'd
==19182== at 0x1B8FF5CD: malloc (vg_replace_malloc.c:130)
==19182== by 0x8048385: f (example.c:5)
==19182== by 0x80483AB: main (example.c:11)

Завваги:

• Valgrind надає багато інформації у кожному повідомленні про помилку; читайте її дуже уважно.

• 19182 — ідентифікатор (ID) процесу; зазвичай, це не важливо.

• Перший рядок (“Invalid write...”) вказує на тип помилки. Тут, програма пише до пам'яті, до якої вона писати не повинна, оскільки це призводить до переповнення буферу.

• Під першим рядком міститься трейс стеку, де вказується місцезнаходження проблеми. Трейс стеку може бути досить великии, і в ньому легко заплутатись особливо при використанні C++ STL. Найпростіше читати його знизу догори. Якщо трейс стеку навпаки, занадто малий та інформативний, скористайтесь опцією --num-callers.

• Адреси кодів (як то, 0x804838F) зазвичай, не є важливими, однак, інколи є критичними для пошуку вад.

• Деякі повідомлення з помилками містять другу частину, в якій міститьтся адреса використаної пам'яті. Вона вказує на останній блок виділеної за допомогою функції malloc() пам'яті, у рядку 5 файлу example.c.

Повідомлення про наявність витоків пам'яті мають наступний вигляд:

==19182== 40 bytes in 1 blocks are definitely lost in
            loss record 1 of 1
==19182== at 0x1B8FF5CD: malloc (vg_replace_malloc.c:130)
==19182== by 0x8048385: f (a.c:5)
==19182== by 0x80483AB: main (a.c:11)

Трейс стеку містить інформацію про те, де саме було виділено пам'ять. На жаль, memcheck не може пояснити вам, чому саме відбуваються витоки пам'яті. (Проігноруйте ‘vg_replace_malloc.c’).

Існує кілька видів витоків пам'яті; ось найважливіші з них:

• “definitely lost”: у вашій програмі присутні витоки пам'яті — виправте їх!

• “probably lost”: у вашій програмі присутні витоки пам'яті, які відбуваються під час роботи із вказівниками.

Використані матеріали:

Advanced Debugging and Profiling for GNU/Linux applications

Коментарі 19

aleks_raiden - 14 серпня 2009, 15:14

«зневаджувальною інформацією» — це просто жах :(

sashko - 14 серпня 2009, 15:17

Будь ласка, запропонуйте свій варіант.

lemon - 14 серпня 2009, 16:13

відлагоджувальна інформація? інформація для відлагодження?

sashko - 14 серпня 2009, 16:17

Якщо перекладати слово «debugging», як «відлагодження», тоді так!

aleks_raiden - 14 серпня 2009, 15:20

слово дебаг (Debug) — приставка де — це не «проти» (сам так можна перекласти — iнформацiя проти вад), в укр. э слово вiдлагодка, тому iнформацiя «вiдлагоджвувальна» (хоч так теж гнiтюче)

P.S. а стаття класна, дякую!

sashko - 14 серпня 2009, 15:23

Для мене завжди останньою інстанцією є ось цей словник: http://dict.linux.org.ua/.

P.S. Радий, що Вам сподолось. Дякую1

aleks_raiden - 14 серпня 2009, 15:25

жаль, що не логiка i власний розсуд :( Не побачив серед авторiв словника когось з лiнгвiстiв чи фiлологiв наприклад

sashko - 14 серпня 2009, 15:34

Дуже прошу не обржати членів української спільноти перекладачів вільного програмного забезпечення.

Більша частина словника є нічим іншим, як витягами з праць профейсійних лінгвістів, тож Ви на цей рахунок дуже сильно помиляєтесь. То дого ж, мова формується не у кабінетах лінгвістичних кафедр університетів ;-)

Якщо Ви маєте якісь зауваження щодо даного перекладу (а це нормально, бо мова — живий організм, який не можна заганяти в якісь рамки), прошу висловити їх на форумі linux.org.ua. Дякую!

aleks_raiden - 14 серпня 2009, 15:39

я не ображав :) констатував факт. А де формуеться мова, розкажiть, будь-ласка. На linux.org.ua логiчнiше обговорювати Linux а не мовнi аспекти, не находите?

sashko - 14 серпня 2009, 15:43

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

aleks_raiden - 14 серпня 2009, 15:44

я констатував свiй висновок просто. До речi, ПО мають займатися спецiальнi люди (з навичками та знаннями), чому мовою нi?

sashko - 14 серпня 2009, 15:48

Я Вас не розумію. Таке враження, що українська мова для Вас не є рідною, і Ви нею погано володієте, або ж Ви наразі зле себе почуваєте, тому що Ви дуже не зрозуміло висловлюєте свої думки, і робити дітячі помилки (наприклад, плутаєте слова місцями). Будь ласка, висловлюйтесь чіткіше.

aleks_raiden - 14 серпня 2009, 15:26

i, до речi, термiн «вада» не найкращий, мало стосуеться ПО

sashko - 14 серпня 2009, 15:36
ВАДА, -и, ж. 1. Негативна риса, особливість кого-, чого-небудь; недолік. // Фізичний недолік внаслідок захворювання або ушкодження організму, а також природжений. Вада вимови. // Пошкодження або неякісність чого-небудь. 2. Те, що шкодить, має шкідливий вплив.

© slovnyk.net

Що таке ПО?

aleks_raiden - 14 серпня 2009, 15:42

Негативна риса, особливість кого-, чого-небудь; недолік. — негативна риса не стосуеться ПО, i це точно не особливicnm (хоча, якщо пiти у фiлософiю, то напевно :) Недолiк, видимо, найточнiше, звiдти ж:

НЕДОЛІК, -у, ч. 1. у чому і без додатка. Недогляд, упущення, помилка і т. ін. у якій-небудь роботі. 2. Негативна риса, ознака і т. ін. кого-, чого-небудь. // Відхилення від норми; дефект.

отже, спiльний термiy всеж таки " помилка", до того ж найближчий до англiйського термiну.

sashko - 14 серпня 2009, 15:45

Я не маю філологічної освіти, тому не вдаватимусь до невігластва, і не дискутуватиму з Вами на цю тему. Ви можете бути й праві, але не мені вирішувати міняти узгоджені спільнотою норми.

Повторюсь, якщо маєте якісь зауваження, доцільно обговорити їх на форумі linux.org.ua.

lemon - 14 серпня 2009, 16:19

можна і тут обговорити :)

таке враження що тут більше людей які використовують у повсякденні слова «debug», «bug» та інші чим на linux.org.ua :))

lemon - 14 серпня 2009, 16:14

самий кращий варіант перекладу це «відлагодження», тому що є такі слова як «полагодження» та налагодження

sashko - 14 серпня 2009, 16:16

Я підкорюсь будь якому розумному рішенню спільноти.

Коментувати
© 2009 - 2018, Розробка - соціальна ІТ спільнота.
Контакти: info@rozrobka.com
Правила користування