Работа с dmalloc

dmalloc е библиотека за откриване на проблеми с паметта - изтичане на памет, достъп до области на паметта извън границите на разпределените блокове (същото като Electric Fence), както и събиране на различни статистики за разпределението на паметта. Тази библиотека заменя стандартните функции за разпределение и освобождаване на памет. Библиотеката е написана в преносим стил и може да се използва на Linux, Solaris и други Unix-съвместими системи, включително MS Windows (в Cygwin среда) 1 .

Според мен в момента използването на тази библиотека не е особено оправдано, тъй като има по-мощни алтернативи - Valgrind и Google Performance Tools.

Подобно на много Unix пакети, dmalloc е доста лесен за сглобяване - трябва да изтеглите изходния код от сайта, да разопаковате и да изпълните три команди:

Ако ще използвате dmalloc с многонишкови програми, ще трябва да подадете опцията --enable-threads към скрипта за конфигуриране.

Използване

Подобно на други пакети за отстраняване на грешки в паметта, използването на 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-съвместими процесори.

Освен това потребителят трябва да посочи нивото на детайлност, с което ще се извърши проверката (ниво на отстраняване на грешки). Има няколко предварително дефинирани стойности ( ниска , време на изпълнение , средна и висока ), които указват предварително дефинирани набори за проверка (от минимум до максимум), но потребителят може също да посочи свои собствени набори за проверка, като използва опцията -d на dmalloc, за да посочи число, описващо желаните проверки, или опцията -p, която ви позволява да посочите проверки, използвайки техните имена, например:

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

Сред другите опции, предавани на 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, както е описано в документацията.