IPB
ЛогинПароль:

 
 Ответить  Открыть новую тему 
> Как отследить утечку памяти во Free Pascal под Go32V2 (DOS32)?
Aelita
сообщение 21.11.2010 1:35
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 12
Пол: Женский

Репутация: -  0  +


Я работаю во Free Pascal под DOS32 (Go32v2).
Периодически возникает задача выяснить, освобождает ли программа память или где-то есть дыра для утечки. wacko.gif
Раньше для этого можно было использовать такие удобные переменные как MemAvail, HeapSize.
Даже если они работали не вполне точно, утечка памяти была наглядно видна. Теперь их, как известно, во Free Pascal нет...
Вопрос к профи:
существуют ли какие-нибудь Units, не входящие во стандартный комплект Free Pascal,
в которых были бы некоторые аналоги этих функций (работающие в том числе с Go32V2 -- DOS32) ?

Сообщение отредактировано: Aelita - 21.11.2010 1:45
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 21.11.2010 1:56
Сообщение #2


Гость






А что, разве модуль heaptrc (компиляция с ключом -gh) с задачей определения утечек не справляется? По-моему, как раз он очень четко показывает все невысвобожденные участки памяти.
 К началу страницы 
+ Ответить 
Aelita
сообщение 21.11.2010 3:05
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 12
Пол: Женский

Репутация: -  0  +


А как с его помощью получить полный объем heap-а и свободной (или занятой) памяти? unsure.gif
(Чтобы сначала понять, есть ли проблема с потерей памяти, и уже после этого искать дыры.)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 21.11.2010 4:12
Сообщение #4


Гость






Если утечек нет, то возвращается другой отчет.

Смотри... (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 19:49
Сообщение #5


Новичок
*

Группа: Пользователи
Сообщений: 12
Пол: Женский

Репутация: -  0  +


Полезная штука, огромное спасибо!

А с операциями New, Dispose она работать, видимо, не будет?

Сообщение отредактировано: Aelita - 21.11.2010 19:50
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 21.11.2010 20:16
Сообщение #6


Гость






Будет, почему нет? Как раз для 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 0:39
Сообщение #7


Гость






Еще раз спасибо за исчерпывающий ответ!!! smile.gif
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 27.04.2024 15:05
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"