Я работаю во Free Pascal под DOS32 (Go32v2). Периодически возникает задача выяснить, освобождает ли программа память или где-то есть дыра для утечки. Раньше для этого можно было использовать такие удобные переменные как MemAvail, HeapSize. Даже если они работали не вполне точно, утечка памяти была наглядно видна. Теперь их, как известно, во Free Pascal нет... Вопрос к профи: существуют ли какие-нибудь Units, не входящие во стандартный комплект Free Pascal, в которых были бы некоторые аналоги этих функций (работающие в том числе с Go32V2 -- DOS32) ?
volvo
21.11.2010 5:56
А что, разве модуль heaptrc (компиляция с ключом -gh) с задачей определения утечек не справляется? По-моему, как раз он очень четко показывает все невысвобожденные участки памяти.
Aelita
21.11.2010 7:05
А как с его помощью получить полный объем heap-а и свободной (или занятой) памяти? (Чтобы сначала понять, есть ли проблема с потерей памяти, и уже после этого искать дыры.)
volvo
21.11.2010 8:12
Если утечек нет, то возвращается другой отчет.
Смотри... (GO32V2 не установлен здесь, поэтому показываю на примере Win32-приложения). Допустим, имеем код, который заведомо без утечек:
uses heaptrc; var p1, p2, p3: pointer;
begin getmem(p1, 100); getmem(p2, 200); getmem(p3, 300);
// ...
freemem(p3); freemem(p2); freemem(p1); end.
, после запуска и завершения работы программы, в консоли наблюдаем отчет:
Running "f:\programs\pascal\tst.exe " Heap dump by heaptrc unit 3 memory blocks allocated : 600/608 3 memory blocks freed : 600/608 0 unfreed memory blocks : 0 True heap size : 163840 (80 used in System startup) True free heap : 163760
Утечек нет, раз "0 unfreed memory blocks"
Теперь внесем утечку, "забудем" вернуть память выделенную под p2:
uses heaptrc; var p1, p2, p3: pointer;
begin getmem(p1, 100); getmem(p2, 200); getmem(p3, 300);
// ...
freemem(p3); // freemem(p2); freemem(p1); end.
и смотрим на результат:
Running "f:\programs\pascal\tst.exe " Heap dump by heaptrc unit 3 memory blocks allocated : 600/608 2 memory blocks freed : 400/408 1 unfreed memory blocks : 200 True heap size : 163840 (80 used in System startup) True free heap : 163488 Should be : 163496 Call trace for block $0005D210 size 200 $00408231
200 байт - утечка... Если будешь компилировать еще и с ключом -gl, то ко всему прочему получишь и место, где была выделена "утекающая" память.
Aelita
21.11.2010 23:49
Полезная штука, огромное спасибо!
А с операциями New, Dispose она работать, видимо, не будет?
volvo
22.11.2010 0:16
Будет, почему нет? Как раз для New/Dispose в первую очередь создавался этот модуль:
Цитата
The HEAPTRC unit can be used to debug your memory allocation/deallocation. It keeps track of the calls to getmem/freemem, and, implicitly, of New/Dispose statements.
Гость
22.11.2010 4:39
Еще раз спасибо за исчерпывающий ответ!!!
Aelita
16.10.2021 4:33
Хотя это очень старая тема, добавлю полезный нюанс: можно добавить кроме строки в шапке:
uses SysUtils, heaptrc;
в основное тело программы строку:
begin SetHeapTraceOutput('heaptrace.log');
........ .......
end.
чтобы информация о расходе памяти шла не только на экран. но и в файл (имя его, конечно, может быть изменено).
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.