Ада-95. Компилятор GNAT



         

Средства GNATDebug_Pools


Использование Unchecked_Deallocation и/или Unchecked_Conversion

может легко привести к некорректным ссылкам памяти.

От проблем, порождаемых подобными ссылками, достаточно сложно избавиться поскольку проявляемые симптомы, как правило, далеки от реального источника проблемы.

В подобных случаях, очень важно обнаружить наличие подобной проблемы как можно раньше.

Именно такая задача возлагается на Storage_Pool предусмотренный в GNAT.Debug_Pools.

Чтобы воспользоваться средствами отладочного пула динамической памяти GNAT, пользователь должен ассоциировать объект отладочного пула с каждым ссылочным типом, который потенциально способен быть источником проблем.

type Ptr is access Some_Type; Pool : GNAT.Debug_Pools.Debug_Pool; for Ptr'Storage_Pool use Pool;

GNAT.Debug_Pool является производным от Checked_Pool, который является характерным для GNAT пулом динамической памяти.

Такие пулы динамической памяти, подобно стандартным пулам динамической памяти Ады, позволяют пользователю переопределять стратегию распределения (аллокацию) и освобождения (деаллокацию) динамической памяти.

Они также предусматривают контрольные точки, для каждого разыменования (расшифровки) ссылок посредством операции Dereference, которая неявно вызывается в процессе разыменования каждого значения ссылочного типа.

После того как ссылочный тип ассоциирован с отладочным пулом, операции над значениями этого типа способны возбудить четыре различных исключения, которые соответствуют четырем потенциальным видам разрушения памяти:

GNAT.Debug_Pools.Accessing_Not_Allocated_Storage

GNAT.Debug_Pools.Accessing_Deallocated_Storage

GNAT.Debug_Pools.Freeing_Not_Allocated_Storage

GNAT.Debug_Pools.Freeing_Deallocated_Storage

Для типов, ассоциированных с отладочным пулом Debug_Pool

динамическое распределение выполняется с помощью использования стандартных подпрограмм размещения динамической памяти GNAT.

Ссылки ко всем фрагментам распределенной памяти сохраняются во внутреннем каталоге.

Стратегия освобождения состоит не в освобождении памяти используемой системы, а в заполнении памяти шаблоном, который может быть легко распознан в процессе отладочной сессии.




Содержание  Назад  Вперед